ZetCode

PHP curl_error 函数

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

PHP curl_error 函数返回一个包含当前 cURL 会话最后错误的字符串。对于调试失败的 cURL 请求至关重要。该函数在 cURL 操作失败时提供人类可读的错误消息。

基本定义

curl_error 函数从 cURL 会话中检索最后一个错误消息。它返回一个纯文本错误消息,如果没有发生错误则返回一个空字符串。该函数以 cURL 句柄作为其唯一参数。

语法:curl_error(CurlHandle $handle): string。始终在 cURL 操作失败后调用此函数。它比仅检查 curl_exec 的 FALSE 值提供更多详细信息。

基本错误处理

此示例演示了在请求由于 URL 无效而失败时使用 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) {
    echo "cURL Error: " . curl_error($ch);
} else {
    echo $response;
}

curl_close($ch);

此代码尝试连接到不存在的域。当 curl_exec 失败时,我们使用 curl_error 获取具体的错误消息。错误可能指示 DNS 解析失败或连接超时。

HTTP 状态码错误处理

此示例展示了如何将 curl_error 与 HTTP 状态码检查结合使用。

http_status.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);

$response = curl_exec($ch);

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

curl_close($ch);

我们请求一个 404 状态码的端点,并将 CURLOPT_FAILONERROR 设置为将 HTTP 错误视为 cURL 错误。我们获取错误消息和错误编号以进行更好的调试。这有助于区分不同类型的故障。

超时错误处理

此示例演示了如何处理 curl_error 的超时错误。

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, 2);

$response = curl_exec($ch);

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

curl_close($ch);

我们为需要 10 秒的请求设置了较短的超时时间(2 秒)。当发生超时时,curl_exec 返回 FALSE。curl_error 提供了有关超时的详细信息。这对于检测缓慢或无响应的服务器很有用。

SSL 证书错误处理

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

ssl_error.php
<?php

declare(strict_types=1);

$ch = curl_init();

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

$response = curl_exec($ch);

if ($response === false) {
    echo "SSL Error: " . curl_error($ch);
} else {
    echo $response;
}

curl_close($ch);

我们尝试连接到一个 SSL 证书已过期的站点。当启用 CURLOPT_SSL_VERIFYPEER 时,这会失败。curl_error 提供了有关 SSL 验证失败的详细信息。出于安全考虑,请始终在生产环境中验证 SSL 证书。

全面的错误处理

此示例演示了全面的错误处理和多重检查。

comprehensive_error.php
<?php

declare(strict_types=1);

function fetchUrl($url) {
    $ch = curl_init();
    
    curl_setopt_array($ch, [
        CURLOPT_URL =>  $url,
        CURLOPT_RETURNTRANSFER =>  true,
        CURLOPT_TIMEOUT =>  5,
        CURLOPT_FOLLOWLOCATION =>  true,
        CURLOPT_SSL_VERIFYPEER =>  true
    ]);

    $response = curl_exec($ch);
    
    if ($response === false) {
        $error = curl_error($ch);
        $errno = curl_errno($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        
        curl_close($ch);
        return "Request failed (HTTP $httpCode, cURL $errno): $error";
    }
    
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    
    if ($httpCode >= 400) {
        return "HTTP Error $httpCode: " . $response;
    }
    
    return $response;
}

echo fetchUrl("https://httpbin.org/status/500");

这个全面的示例检查 cURL 错误、HTTP 状态码,并提供详细的错误信息。我们使用 curl_getinfo 来获取 HTTP 状态码,即使 curl_exec 失败。这种方法提供了最大的调试信息。

最佳实践

来源

PHP curl_error 文档

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

作者

我叫 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直撰写编程文章。至今,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

所有 PHP cURL 教程列表。