PHP curl_share_init 函数
最后修改日期:2025 年 4 月 11 日
PHP curl_share_init
函数创建一个共享的 cURL 句柄。它允许多个 cURL 句柄共享数据,如 cookie 和 DNS 缓存。当向同一服务器发出多个请求时,这可以提高性能。
基本定义
curl_share_init
函数初始化一个共享的 cURL 句柄。它返回一个可以与 curl_share_setopt
一起使用的资源。共享句柄有助于减少发出相似请求时的开销。
语法:curl_share_init(): CurlShareHandle|false
。该函数返回一个共享句柄,如果失败则返回 FALSE。完成后务必使用 curl_share_close()
清理。
基本共享句柄示例
此示例演示了为两个 cURL 请求创建基本共享句柄。
<?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/api1"); curl_setopt($ch1, CURLOPT_SHARE, $sh); curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true); $ch2 = curl_init("https://example.com/api2"); curl_setopt($ch2, CURLOPT_SHARE, $sh); curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true); $result1 = curl_exec($ch1); $result2 = curl_exec($ch2); curl_close($ch1); curl_close($ch2); curl_share_close($sh);
我们创建一个共享句柄并配置它来共享 cookie。两个 cURL 句柄都使用相同的共享句柄。这允许它们在请求之间共享 cookie 数据。完成后务必关闭所有句柄。
共享 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://api.example.com/users"); curl_setopt($ch1, CURLOPT_SHARE, $sh); curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true); $ch2 = curl_init("https://api.example.com/posts"); curl_setopt($ch2, CURLOPT_SHARE, $sh); curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true); $response1 = curl_exec($ch1); $response2 = curl_exec($ch2); curl_close($ch1); curl_close($ch2); curl_share_close($sh);
我们将共享句柄配置为共享 DNS 缓存。对同一域的两个请求都将受益于缓存的 DNS 查询。这减少了对同一服务器的后续请求的延迟。
共享 SSL 会话数据
此示例演示了在请求之间共享 SSL 会话数据。
<?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/login"); curl_setopt($ch1, CURLOPT_SHARE, $sh); curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true); $ch2 = curl_init("https://secure.example.com/profile"); curl_setopt($ch2, CURLOPT_SHARE, $sh); curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true); $login = curl_exec($ch1); $profile = curl_exec($ch2); curl_close($ch1); curl_close($ch2); curl_share_close($sh);
我们在对同一安全域的请求之间共享 SSL 会话数据。这避免了后续请求的冗余 SSL 握手。对于需要多个身份验证请求的 API 尤其有用。
共享多种数据类型
此示例展示了如何在句柄之间共享多种数据类型。
<?php declare(strict_types=1); $sh = curl_share_init(); curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE | CURL_LOCK_DATA_DNS | CURL_LOCK_DATA_SSL_SESSION); $ch1 = curl_init("https://api.example.com/auth"); curl_setopt($ch1, CURLOPT_SHARE, $sh); curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true); $ch2 = curl_init("https://api.example.com/data"); curl_setopt($ch2, CURLOPT_SHARE, $sh); curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true); $auth = curl_exec($ch1); $data = curl_exec($ch2); curl_close($ch1); curl_close($ch2); curl_share_close($sh);
我们在请求之间共享 cookie、DNS 缓存和 SSL 会话数据。按位或运算符组合了多个共享选项。这为相关请求提供了最大的性能优势。
共享句柄的错误处理
此示例演示了在使用共享句柄时进行适当的错误处理。
<?php declare(strict_types=1); $sh = curl_share_init(); if ($sh === false) { die("Failed to initialize shared handle"); } if (!curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE)) { die("Failed to set share option"); } $ch1 = curl_init("https://api.example.com/endpoint1"); if ($ch1 === false) { die("Failed to initialize cURL handle 1"); } curl_setopt($ch1, CURLOPT_SHARE, $sh); curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch1); if ($result === false) { echo "cURL Error: " . curl_error($ch1); } else { echo $result; } curl_close($ch1); curl_share_close($sh);
我们实现了共享句柄创建和配置的全面错误检查。在继续之前验证每个步骤。这确保了生产环境中健壮的错误处理。
最佳实践
- 清理:务必使用 curl_share_close 关闭共享句柄。
- 错误处理:检查所有 cURL 函数的返回值。
- 共享范围:仅在相关请求之间共享。
- 线程安全:共享句柄不是线程安全的。
- 性能:在进行复杂共享之前衡量其优势。
来源
本教程通过实际示例介绍了 PHP curl_share_init
函数,展示了其在优化多个 cURL 请求方面的用法。