ZetCode

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 句柄中的错误。

basic_error_check.php
<?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 时进行错误检查。

cookie_sharing.php
<?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 缓存时的错误处理。

dns_sharing.php
<?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 句柄一起用于请求。

多线程共享

此示例显示了在多线程共享场景中的错误检查。

threaded_sharing.php
<?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 提供详细的错误信息。这对于健壮的多线程应用程序至关重要。

完整共享示例

此示例演示了一个具有完整错误处理的完整共享场景。

complete_sharing.php
<?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 获取特定的错误代码。在所有情况下都会正确清理共享句柄。

最佳实践

来源

PHP curl_share_errno 文档

本教程通过实际示例介绍了 PHP curl_share_errno 函数,展示了其在共享 cURL 句柄场景中的用法。

作者

我叫 Jan Bodnar,是一名热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

所有 PHP cURL 教程列表。