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 选项。
<?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 请求。
<?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 头部。
<?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
在输出中包含响应头部,用于调试。
带进度的文件下载
此示例展示了如何使用进度回调函数下载文件。
<?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 证书验证设置。
<?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
检查证书名称是否与主机匹配。在生产环境中务必使用正确的验证。
最佳实践
- 错误处理:始终检查 curl_setopt 的返回值。
- 清理:使用后通过 curl_close 关闭句柄。
- SSL 安全:为 HTTPS 请求启用验证。
- 超时:设置合理的超时值。
- 内存:大文件下载使用 CURLOPT_FILE。
来源
本教程通过实际示例介绍了 PHP curl_setopt
函数,展示了其在各种 HTTP 请求配置中的用法。