ZetCode

PHP curl_errno 函数

最后修改日期:2025 年 4 月 11 日

PHP `curl_errno` 函数返回 cURL 会话的最后一个错误号。它对于 cURL 操作中的错误处理至关重要。当 HTTP 请求失败时,该函数有助于识别具体问题。

基本定义

`curl_errno` 函数返回一个整数,表示最后一个 cURL 错误。它将 cURL 句柄作为其唯一参数。如果没有发生错误,则返回 0。

语法: `curl_errno(CurlHandle $handle): int`。句柄必须是有效的 cURL 资源。在 cURL 操作失败后,始终调用此函数以获取具体的错误代码。

基本错误处理

此示例展示了使用 curl_errno 和 curl_error 进行基本错误处理。

basic_error.php
<?php

declare(strict_types=1);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://nonexistent.example.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);

if ($response === false) {
    $errno = curl_errno($ch);
    $error = curl_error($ch);
    echo "cURL Error ($errno): $error";
} else {
    echo $response;
}

curl_close($ch);

此代码尝试连接到一个不存在的域。当请求失败时,我们使用 curl_errno 获取错误代码,使用 curl_error 获取错误消息。这有助于诊断连接问题。

处理特定错误

此示例演示了如何处理特定的 cURL 错误号。

specific_errors.php
<?php

declare(strict_types=1);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://example.com:81"); // Invalid port
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);

$response = curl_exec($ch);

if ($response === false) {
    $errno = curl_errno($ch);
    
    switch ($errno) {
        case CURLE_COULDNT_CONNECT:
            echo "Connection failed (Error $errno)";
            break;
        case CURLE_OPERATION_TIMEDOUT:
            echo "Request timed out (Error $errno)";
            break;
        default:
            echo "cURL Error ($errno): " . curl_error($ch);
    }
}

curl_close($ch);

我们故意使用无效端口来触发连接错误。switch 语句以不同的方式处理特定的错误代码。CURLE_COULDNT_CONNECT (7) 表示连接失败。

SSL 证书验证错误

此示例展示了如何处理 SSL 证书验证错误。

ssl_error.php
<?php

declare(strict_types=1);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://self-signed.badssl.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);

$response = curl_exec($ch);

if ($response === false) {
    $errno = curl_errno($ch);
    
    if ($errno === CURLE_SSL_CACERT || $errno === CURLE_SSL_CERTPROBLEM) {
        echo "SSL Certificate Error ($errno): " . curl_error($ch);
    } else {
        echo "Other cURL Error ($errno): " . curl_error($ch);
    }
}

curl_close($ch);

我们尝试连接到一个带有自签名证书的网站。启用 SSL 验证后,这会触发证书错误。我们专门检查与 SSL 相关的错误代码(60 和 58)。

超时错误处理

此示例演示了如何使用 curl_errno 处理超时错误。

timeout_error.php
<?php

declare(strict_types=1);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://httpbin.org/delay/10");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 3); // 3 second timeout

$response = curl_exec($ch);

if ($response === false) {
    $errno = curl_errno($ch);
    
    if ($errno === CURLE_OPERATION_TIMEDOUT) {
        echo "Request timed out after 3 seconds (Error $errno)";
    } else {
        echo "cURL Error ($errno): " . curl_error($ch);
    }
}

curl_close($ch);

我们设置了一个较短的超时时间,并请求了一个延迟响应。当发生超时时,curl_errno 返回 CURLE_OPERATION_TIMEDOUT (28)。这有助于区分超时错误和其他类型的失败。

检查多个错误条件

此示例展示了如何通过多个条件进行全面的错误检查。

multiple_errors.php
<?php

declare(strict_types=1);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://httpbin.org/status/404");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FAILONERROR, true); // Consider HTTP errors as failures

$response = curl_exec($ch);

if ($response === false) {
    $errno = curl_errno($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    
    if ($errno === 0 && $httpCode >= 400) {
        echo "HTTP Error: $httpCode";
    } else {
        echo "cURL Error ($errno): " . curl_error($ch);
    }
}

curl_close($ch);

我们将 curl_errno 与 HTTP 状态码检查结合使用。CURLOPT_FAILONERROR 使 cURL 在 HTTP 状态码 >= 400 时失败。请注意,HTTP 错误可能返回 errno 0,这需要额外的状态码检查。

最佳实践

来源

PHP curl_errno 文档

本教程通过实际示例介绍了 PHP `curl_errno` 函数,展示了其在各种错误处理场景下的用法。

作者

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

所有 PHP cURL 教程列表。