PHP cURL HTTP CODE return 0


PHP cURL HTTP CODE return 0

我不明白当我回显$httpCode我总是得到 0,当我将 $html_brand 更改为损坏的 url 时,我期待 404。有什么我想念或不知道的吗?谢谢。

 //check if url exist
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $html_brand);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$response = curl_exec($ch); 
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($httpCode == 404) {
    echo "The Web Page Cannot Be Found";
    return;
}
curl_close($ch);

如果您与服务器连接,则可以从中获取返回代码,否则它将失败并得到 0。因此,如果您尝试连接到"www.google.com/lksdfk",您将获得返回代码 400,如果您直接转到 google.com,您将获得 302(然后是 200,如果您转发到下一页......好吧,我这样做是因为它转发到 google.com.br,所以你可能得不到),如果你去"googlecom"你会得到一个0(找不到主机),所以对于最后一个,没有人可以发回代码。

使用以下代码进行测试。

<?php
$html_brand = "www.google.com";
$ch = curl_init();
$options = array(
    CURLOPT_URL            => $html_brand,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER         => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_ENCODING       => "",
    CURLOPT_AUTOREFERER    => true,
    CURLOPT_CONNECTTIMEOUT => 120,
    CURLOPT_TIMEOUT        => 120,
    CURLOPT_MAXREDIRS      => 10,
);
curl_setopt_array( $ch, $options );
$response = curl_exec($ch); 
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ( $httpCode != 200 ){
    echo "Return code is {$httpCode} 'n"
        .curl_error($ch);
} else {
    echo "<pre>".htmlspecialchars($response)."</pre>";
}
curl_close($ch);

curl_exec后尝试此操作以查看问题所在:

print curl_error($ch);

如果打印的内容为"格式不正确",请检查您的 URL 格式。

检查curl_getinfo后的curl_error以找出隐藏的错误。

if(curl_errno($ch)){   
    echo 'Curl error: ' . curl_error($ch);
}

试试这个:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

就像这里和下面所说的那样,失败的请求(即找不到服务器)返回 false,没有 HTTP 状态代码,因为从未收到回复。

呼叫curl_error()

我遇到了同样的问题,就我而言,这是因为curl_exec函数在 php.ini 中被禁用。检查日志:

PHP Warning:  curl_exec() has been disabled for security reasons in /var/www/***/html/test.php on line 18

解决方案是从服务器配置文件上的 php.ini 中禁用的函数中删除curl_exec。

您要传递到 $html_brand 的确切内容是什么?

如果它具有无效的 URL 语法,您很可能会得到 HTTP 代码 0。

PHP 返回 http 代码 0 的另一个原因是超时。就我而言,我有以下配置:

curl_setopt($http,CURLOPT_TIMEOUT_MS,500);

事实证明,对我指向的端点的请求总是花费超过 500 毫秒,总是超时并且总是返回 http 代码 0。

如果您删除此设置 (CURLOPT_TIMEOUT_MS) 或输入更高的值(在我的例子中为 5000),您将获得实际的 http 代码,在我的例子中为 200(如预期的那样)。

请参阅 https://www.php.net/manual/en/function.curl-setopt.php

如果您使用的是selinux,则可能是因为安全限制。 尝试将其设置为根:

# setsebool -P httpd_can_network_connect on

还要检查命令的执行顺序。

curl_exec,然后curl_getinfo.

$response = curl_exec($ch); 
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
对我来说

,发出网址,直到我编码网址参数值,我得到http代码0。

就我而言,每当 URL 中有空格(即 URL 未编码)时,我都会CURLINFO_RESPONSE_CODE得到 0(零)。以及 URL 中的任何位置(地址部分、查询部分、任何)。所以,这不好:

https://my.do main.com //(this is never good)

https://my.domain.com?date=2022-12-29 13:55:10&type=apparel //you can see how date formatting breaks the query for cURL

等。显然,请求的链接或其部分必须正确组装,如果根据定义,值可以包含空字符串,则必须对 url 查询中的参数值进行百分比编码。我知道这不是什么大问题,但我有这样的案例,我在这里的答案中没有看到它。