ZetCode

PHP curl_setopt 函数

最后修改日期:2025 年 4 月 11 日

PHP curl_setopt 函数用于设置 cURL 传输的选项。在执行之前配置 cURL 句柄至关重要。选项控制着 URL、头部和传输行为等各种方面。

基本定义

curl_setopt 函数用于设置给定 cURL 会话句柄上的一个选项。成功时返回 TRUE,失败时返回 FALSE。该函数接受三个参数:句柄 (handle)、选项 (option) 和值 (value)。

语法:curl_setopt(CurlHandle $handle, int $option, mixed $value): bool。句柄必须通过 curl_init() 创建。有数百个选项可用于自定义 cURL 的行为。

设置基本选项

此示例演示了为 GET 请求设置基本 cURL 选项。

basic_options.php
<?php

declare(strict_types=1);

$ch = curl_init();

// Set the target URL
curl_setopt($ch, CURLOPT_URL, "https://api.example.com/data");

// Return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// Set timeout to 30 seconds
curl_setopt($ch, CURLOPT_TIMEOUT, 30);

// Follow redirects
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

$response = curl_exec($ch);

if ($response === false) {
    echo "cURL Error: " . curl_error($ch);
} else {
    echo $response;
}

curl_close($ch);

此代码配置了可靠的 HTTP 请求所需的关键选项。CURLOPT_RETURNTRANSFER 使 curl_exec 返回响应。CURLOPT_TIMEOUT 防止挂起,而 CURLOPT_FOLLOWLOCATION 处理重定向。

带 JSON 数据的 POST 请求

此示例展示了如何配置带有 JSON 载荷的 POST 请求。

post_json.php
<?php

declare(strict_types=1);

$ch = curl_init();

$data = [
    'name' =>  'John Doe',
    'email' =>  'john@example.com'
];

$jsonData = json_encode($data);

curl_setopt($ch, CURLOPT_URL, "https://api.example.com/users");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/json',
    'Content-Length: ' . strlen($jsonData)
]);

$response = curl_exec($ch);

if ($response === false) {
    echo "cURL Error: " . curl_error($ch);
} else {
    echo "Response: " . $response;
}

curl_close($ch);

我们配置了一个带 JSON 数据的 POST 请求。CURLOPT_POST 设置了请求方法,而 CURLOPT_POSTFIELDS 包含了 JSON 载荷。头部指定了内容类型和长度,以确保正确的 API 通信。

自定义请求头部

此示例演示了为 API 身份验证设置自定义 HTTP 头部。

custom_headers.php
<?php

declare(strict_types=1);

$ch = curl_init();

$headers = [
    'Authorization: Bearer abc123xyz456',
    'X-API-Version: 2.0',
    'Accept: application/json',
    'Cache-Control: no-cache'
];

curl_setopt($ch, CURLOPT_URL, "https://api.example.com/protected");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_HEADER, true); // Include headers in output

$response = curl_exec($ch);

if ($response === false) {
    echo "cURL Error: " . curl_error($ch);
} else {
    echo $response;
}

curl_close($ch);

我们设置了多个自定义头部,包括一个授权令牌。CURLOPT_HTTPHEADER 接受一个头部字符串数组。CURLOPT_HEADER 在输出中包含响应头部,用于调试。

带进度的文件下载

此示例展示了如何使用进度回调函数下载文件。

file_download.php
<?php

declare(strict_types=1);

function progressCallback($download_size, $downloaded, $upload_size, $uploaded) {
    if ($download_size > 0) {
        $percent = round($downloaded / $download_size * 100);
        echo "Downloaded: $percent% ($downloaded/$download_size bytes)\n";
    }
}

$ch = curl_init();

$file = fopen("download.zip", 'w');

curl_setopt($ch, CURLOPT_URL, "https://example.com/largefile.zip");
curl_setopt($ch, CURLOPT_FILE, $file);
curl_setopt($ch, CURLOPT_NOPROGRESS, false);
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'progressCallback');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

$result = curl_exec($ch);

fclose($file);

if ($result === false) {
    echo "Download failed: " . curl_error($ch);
} else {
    echo "Download completed successfully";
}

curl_close($ch);

此代码在显示进度的同时下载文件。CURLOPT_FILE 直接写入文件句柄。进度回调函数会接收下载统计信息。这对于大文件非常高效,因为它避免了内存问题。

SSL 证书验证

此示例演示了正确的 SSL 证书验证设置。

ssl_verification.php
<?php

declare(strict_types=1);

$ch = curl_init();

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

// Enable SSL verification (recommended for production)
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);

// Specify CA bundle path
curl_setopt($ch, CURLOPT_CAINFO, "/path/to/cacert.pem");

// For debugging SSL issues (remove in production)
// curl_setopt($ch, CURLOPT_VERBOSE, true);

$response = curl_exec($ch);

if ($response === false) {
    echo "SSL Error: " . curl_error($ch);
} else {
    echo "Secure connection established";
    // Process $response...
}

curl_close($ch);

此配置确保了正确的 SSL 证书验证。CURLOPT_SSL_VERIFYPEER 验证对等方的证书。CURLOPT_SSL_VERIFYHOST 检查证书名称是否与主机匹配。在生产环境中务必使用正确的验证。

最佳实践

来源

PHP curl_setopt 文档

本教程通过实际示例介绍了 PHP curl_setopt 函数,展示了其在各种 HTTP 请求配置中的用法。

作者

我的名字是 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。自 2007 年以来我一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

所有 PHP cURL 教程列表。