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 请求方面的用法。