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` 函数,展示了其在各种错误处理场景下的用法。