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 句柄场景中的用法。