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 进行基本错误处理。
<?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 错误号。
<?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 证书验证错误。
<?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 处理超时错误。
<?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)。这有助于区分超时错误和其他类型的失败。
检查多个错误条件
此示例展示了如何通过多个条件进行全面的错误检查。
<?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,这需要额外的状态码检查。
最佳实践
- 执行后检查:始终在 curl_exec 之后调用 curl_errno。
- 与 curl_error 结合使用:同时使用两者以获取完整的错误信息。
- 特定处理:具体处理重要的错误。
- HTTP 状态码:即使 errno 为 0,也要检查这些。
- 文档:参考 cURL 错误常量以了解其含义。
来源
本教程通过实际示例介绍了 PHP `curl_errno` 函数,展示了其在各种错误处理场景下的用法。