PHP curl_setopt函数

定义和用法

curl_setopt() 函数用于设置cURL传输选项,控制cURL会话的行为。通过该函数可以设置URL、请求方法、超时时间、请求头等各种参数。

提示: curl_setopt() 必须在curl_init()初始化之后和curl_exec()执行之前调用。

语法

bool curl_setopt ( resource $ch , int $option , mixed $value )

参数

参数 描述 类型 必需
ch curl_init() 返回的cURL句柄 resource
option 需要设置的CURLOPT_XXX选项 int
value 选项要设置的值 mixed

返回值

成功时返回 TRUE,失败时返回 FALSE

常用选项

选项 描述 值类型 示例值
CURLOPT_URL 要获取的URL地址 string "https://example.com"
CURLOPT_RETURNTRANSFER 将curl_exec()获取的信息以字符串返回 bool true
CURLOPT_POST 启用POST请求 bool true
CURLOPT_POSTFIELDS POST请求的数据 mixed "name=John"
CURLOPT_HEADER 是否包含header信息在输出中 bool false
CURLOPT_TIMEOUT 允许cURL函数执行的最长秒数 int 30
CURLOPT_HTTPHEADER 设置HTTP头字段的数组 array ['Content-Type: application/json']
CURLOPT_FOLLOWLOCATION 跟随重定向 bool true
CURLOPT_SSL_VERIFYPEER 验证对等证书 bool false
CURLOPT_USERAGENT 设置用户代理字符串 string "Mozilla/5.0..."

示例

示例 1:基本的GET请求设置

<?php
// 初始化cURL
$ch = curl_init();

// 设置基本选项
curl_setopt($ch, CURLOPT_URL, "https://api.example.com/users");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);

// 执行请求
$response = curl_exec($ch);

if (curl_error($ch)) {
    echo 'Error: ' . curl_error($ch);
} else {
    echo $response;
}

curl_close($ch);
?>

示例 2:使用curl_setopt_array设置多个选项

<?php
$ch = curl_init();

// 使用数组一次性设置多个选项
$options = [
    CURLOPT_URL => "https://api.example.com/login",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => http_build_query([
        'username' => 'admin',
        'password' => 'secret'
    ]),
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/x-www-form-urlencoded',
        'User-Agent: MyApp/1.0'
    ],
    CURLOPT_TIMEOUT => 30,
    CURLOPT_FOLLOWLOCATION => true
];

curl_setopt_array($ch, $options);

$result = curl_exec($ch);
curl_close($ch);

echo $result;
?>

示例 3:设置SSL和代理选项

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://secure.example.com/api");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// SSL相关设置
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 不验证对等证书
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 不验证主机

// 代理设置(如果需要)
curl_setopt($ch, CURLOPT_PROXY, "proxy.example.com:8080");
curl_setopt($ch, CURLOPT_PROXYUSERPWD, "username:password");

// 调试信息
curl_setopt($ch, CURLOPT_VERBOSE, true);

$response = curl_exec($ch);

if (curl_errno($ch)) {
    echo 'cURL Error: ' . curl_error($ch);
} else {
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    echo "HTTP Code: " . $httpCode . "\n";
    echo "Response: " . $response;
}

curl_close($ch);
?>

示例 4:文件上传和自定义头信息

<?php
$ch = curl_init();

// 文件上传
$file = '/path/to/file.jpg';
$postData = [
    'file' => new CURLFile($file),
    'description' => 'My uploaded file'
];

curl_setopt($ch, CURLOPT_URL, "https://api.example.com/upload");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// 自定义头信息
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer your_access_token',
    'Content-Type: multipart/form-data',
    'X-Custom-Header: custom_value'
]);

// 进度回调函数(PHP 5.5+)
curl_setopt($ch, CURLOPT_NOPROGRESS, false);
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, function($resource, $download_size, $downloaded, $upload_size, $uploaded) {
    if ($upload_size > 0) {
        $progress = round(($uploaded / $upload_size) * 100);
        echo "Upload progress: {$progress}%\n";
    }
});

$result = curl_exec($ch);
curl_close($ch);

echo $result;
?>

注意事项

重要:
  • 选项名称必须是有效的CURLOPT_XXX常量
  • 设置选项时要注意值的类型,不同的选项需要不同类型的值
  • 在生产环境中,建议设置合适的超时时间
  • 对于HTTPS请求,注意SSL验证相关的设置
  • 使用完cURL句柄后要及时关闭释放资源