PHP curl_share_setopt 函数
最后修改日期:2025 年 4 月 11 日
PHP curl_share_setopt 函数用于设置 cURL 共享句柄的选项。它允许多个 cURL 句柄共享数据,如 cookies 和 DNS 缓存。这在向同一服务器发出多个请求时可以提高性能。
基本定义
curl_share_setopt 函数配置一个共享的 cURL 句柄。它接受三个参数:共享句柄、要设置的选项以及值。成功时函数返回 TRUE,失败时返回 FALSE。
语法:curl_share_setopt(CurlShareHandle $share_handle, int $option, mixed $value): bool。共享句柄必须使用 curl_share_init() 创建。始终使用 curl_share_close() 进行清理。
共享 DNS 缓存
此示例演示了如何在多个 cURL 句柄之间共享 DNS 缓存。
<?php
declare(strict_types=1);
$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
$ch1 = curl_init("https://example.com/api/v1");
curl_setopt($ch1, CURLOPT_SHARE, $sh);
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
$ch2 = curl_init("https://example.com/api/v2");
curl_setopt($ch2, CURLOPT_SHARE, $sh);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
$mh = curl_multi_init();
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
do {
curl_multi_exec($mh, $running);
} while ($running > 0);
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
curl_share_close($sh);
我们创建一个共享句柄并将其配置为共享 DNS 缓存。然后将两个 cURL 句柄与此共享句柄关联。 DNS 解析仅执行一次,并缓存以供后续请求使用。
共享 Cookies
此示例显示了如何在多个 cURL 会话之间共享 cookies。
<?php
declare(strict_types=1);
$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
$ch1 = curl_init("https://example.com/login");
curl_setopt($ch1, CURLOPT_SHARE, $sh);
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch1, CURLOPT_COOKIEJAR, "/tmp/cookies.txt");
$response = curl_exec($ch1);
curl_close($ch1);
$ch2 = curl_init("https://example.com/profile");
curl_setopt($ch2, CURLOPT_SHARE, $sh);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_COOKIEFILE, "/tmp/cookies.txt");
$response = curl_exec($ch2);
curl_close($ch2);
curl_share_close($sh);
我们将共享句柄配置为共享 cookies。第一个请求将 cookies 存储在文件中,第二个请求使用这些 cookies。这在请求之间维护会话状态。
共享 SSL 会话
此示例演示了共享 SSL 会话数据以提高 HTTPS 性能。
<?php
declare(strict_types=1);
$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION);
$ch1 = curl_init("https://secure.example.com/api1");
curl_setopt($ch1, CURLOPT_SHARE, $sh);
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
$ch2 = curl_init("https://secure.example.com/api2");
curl_setopt($ch2, CURLOPT_SHARE, $sh);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
$mh = curl_multi_init();
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
do {
curl_multi_exec($mh, $running);
} while ($running > 0);
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
curl_share_close($sh);
我们在对同一服务器的两个 HTTPS 请求之间共享 SSL 会话数据。这避免了为后续连接重复 SSL 握手。它显著提高了对多个 HTTPS 请求的性能。
多个共享资源
此示例展示了如何同时共享多种类型的数据。
<?php
declare(strict_types=1);
$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS | CURL_LOCK_DATA_COOKIE | CURL_LOCK_DATA_SSL_SESSION);
$ch1 = curl_init("https://api.example.com/v1/users");
curl_setopt($ch1, CURLOPT_SHARE, $sh);
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
$ch2 = curl_init("https://api.example.com/v1/products");
curl_setopt($ch2, CURLOPT_SHARE, $sh);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
$mh = curl_multi_init();
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
do {
curl_multi_exec($mh, $running);
} while ($running > 0);
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
curl_share_close($sh);
我们在两个请求之间共享 DNS 缓存、cookies 和 SSL 会话数据。按位或运算符用于组合多个共享选项。这为重复的 API 调用提供了最大的性能优势。
错误处理
此示例演示了如何使用共享 cURL 句柄进行适当的错误处理。
<?php
declare(strict_types=1);
$sh = curl_share_init();
if ($sh === false) {
die("Failed to initialize share handle");
}
if (!curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS)) {
die("Failed to set share option");
}
$ch = curl_init("https://example.com");
if ($ch === false) {
curl_share_close($sh);
die("Failed to initialize cURL handle");
}
curl_setopt($ch, CURLOPT_SHARE, $sh);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if ($response === false) {
echo "cURL Error: " . curl_error($ch);
} else {
echo $response;
}
curl_close($ch);
curl_share_close($sh);
我们对所有 cURL 操作实施全面的错误检查。检查每个函数调用,并妥善清理资源。这可以防止内存泄漏并提供更好的调试信息。
最佳实践
- 资源管理:使用后始终关闭共享句柄。
- 错误检查:验证所有 cURL 函数的返回值。
- 适当共享:仅共享安全所需的内容。
- 多线程:在 PHP 中,共享句柄是线程安全的。
- 性能:对重复的同一服务器请求使用共享。
来源
本教程通过实际示例介绍了 PHP curl_share_setopt 函数,展示了它在优化多个 cURL 请求方面的用法。