PHP curl_share_errno 函数
最后修改日期:2025 年 4 月 11 日
PHP curl_share_errno
函数返回共享 cURL 句柄的最后一个错误号。它与 cURL 共享句柄一起使用,用于识别共享资源操作中的错误。这有助于调试多句柄场景。
基本定义
curl_share_errno
函数返回一个整数,表示共享 cURL 句柄的最后一个错误号。它以 cURL 共享句柄作为唯一参数,如果没有发生错误,则返回 0。
语法:curl_share_errno(CurlShareHandle $share_handle): int
。共享句柄必须使用 curl_share_init()
创建。此函数对于多句柄 cURL 操作中的错误检查很有用。
基本共享句柄错误检查
此示例演示了如何检查基本共享 cURL 句柄中的错误。
<?php declare(strict_types=1); $sh = curl_share_init(); // Attempt to set an invalid option $result = curl_share_setopt($sh, 9999, CURLSHOPT_SHARE); $errno = curl_share_errno($sh); if ($errno !== 0) { echo "Shared cURL error: " . $errno . "\n"; echo "Error message: " . curl_share_strerror($errno) . "\n"; } else { echo "No errors in shared handle\n"; } curl_share_close($sh);
此代码创建一个共享句柄并尝试设置一个无效的选项。然后,我们使用 curl_share_errno
检查错误。如果发生错误,将显示错误号和消息。请始终关闭共享句柄。
句柄之间共享 Cookie
此示例显示了在 cURL 句柄之间共享 Cookie 时进行错误检查。
<?php declare(strict_types=1); $sh = curl_share_init(); $ch1 = curl_init(); $ch2 = curl_init(); // Share cookies between handles $result = curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE); $errno = curl_share_errno($sh); if ($errno !== 0) { die("Failed to share cookies: " . curl_share_strerror($errno)); } curl_setopt($ch1, CURLOPT_SHARE, $sh); curl_setopt($ch2, CURLOPT_SHARE, $sh); // Perform requests... curl_share_close($sh); curl_close($ch1); curl_close($ch2);
我们创建一个共享句柄,用于在两个 cURL 句柄之间共享 Cookie。设置共享选项后,我们使用 curl_share_errno
检查错误。这可以确保在使用句柄之前已正确配置共享。
共享 DNS 缓存
此示例演示了在句柄之间共享 DNS 缓存时的错误处理。
<?php declare(strict_types=1); $sh = curl_share_init(); // Share DNS cache if (!curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS)) { $errno = curl_share_errno($sh); die("DNS sharing failed: " . curl_share_strerror($errno)); } $ch = curl_init(); curl_setopt($ch, CURLOPT_SHARE, $sh); curl_setopt($ch, CURLOPT_URL, "https://example.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); if ($response === false) { echo "Request failed: " . curl_error($ch); } curl_close($ch); curl_share_close($sh);
此代码在句柄之间共享 DNS 缓存以提高性能。我们检查共享操作是否成功,并在失败时使用 curl_share_errno
。然后,共享句柄将与常规 cURL 句柄一起用于请求。
多线程共享
此示例显示了在多线程共享场景中的错误检查。
<?php declare(strict_types=1); $sh = curl_share_init(); // Share both cookies and DNS cache $options = [ CURLSHOPT_SHARE => CURL_LOCK_DATA_COOKIE | CURL_LOCK_DATA_DNS ]; foreach ($options as $opt => $value) { if (!curl_share_setopt($sh, $opt, $value)) { $errno = curl_share_errno($sh); throw new RuntimeException( "Share option failed: " . curl_share_strerror($errno) ); } } // Use the shared handle in multiple threads... curl_share_close($sh);
我们为 Cookie 和 DNS 缓存共享配置了一个共享句柄。会检查每个 setopt 调用的成功情况,并在需要时使用 curl_share_errno
提供详细的错误信息。这对于健壮的多线程应用程序至关重要。
完整共享示例
此示例演示了一个具有完整错误处理的完整共享场景。
<?php declare(strict_types=1); function create_shared_handle() { $sh = curl_share_init(); if ($sh === false) { throw new RuntimeException("Failed to create share handle"); } // Configure sharing options $shareOptions = [ CURLSHOPT_SHARE => CURL_LOCK_DATA_COOKIE | CURL_LOCK_DATA_SSL_SESSION ]; foreach ($shareOptions as $opt => $value) { if (!curl_share_setopt($sh, $opt, $value)) { $errno = curl_share_errno($sh); curl_share_close($sh); throw new RuntimeException( "Share option failed: " . curl_share_strerror($errno) ); } } return $sh; } try { $sh = create_shared_handle(); $ch1 = curl_init(); curl_setopt_array($ch1, [ CURLOPT_URL => "https://api.example.com/login", CURLOPT_SHARE => $sh, CURLOPT_RETURNTRANSFER => true ]); // More handles and requests... curl_share_close($sh); } catch (RuntimeException $e) { echo "Error: " . $e->getMessage() . "\n"; }
此完整示例展示了在共享句柄的整个生命周期中正确的错误处理。我们检查创建错误、配置错误,并使用 curl_share_errno
获取特定的错误代码。在所有情况下都会正确清理共享句柄。
最佳实践
- 错误检查:操作后始终检查 curl_share_errno。
- 资源清理:使用 curl_share_close 关闭共享句柄。
- 线程安全:在多线程应用程序中共享时要小心。
- 组合选项:分别检查每个共享选项。
- 错误消息:使用 curl_share_strerror 获取可读的错误信息。
来源
本教程通过实际示例介绍了 PHP curl_share_errno
函数,展示了其在共享 cURL 句柄场景中的用法。