PHP cURL HTTP代码返回0


95

我不明白当我回显$ 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);

Answers:


95

如果您与服务器连接,则可以从中获取返回码,否则它将失败并得到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);

1
也为引用跟随位置而设,有时我会收到301,这是重定向问题。
Ardeus 2012年

即使$ response具有html内容,也很奇怪,但是$ httpcode始终返回0,加上curl_error为null。可能出了什么问题。我仅在设置中包括returntransfer,标头(false),followlocation。
阿迪斯(Ardeus)

只需添加一下,如果URL之前或之后有空格,它也会抛出http_code = 0
Raja Amer Khan


80

在curl_exec之后尝试以下操作,以查看问题所在:

print curl_error($ch);

如果打印出“格式错误”之类的内容,请检查您的URL格式。


5
感谢您的建议-保存了我的屁股:)
wbj

是!救了我的屁股。
pimbrouwers

5

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

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

2

如此和下文所述,失败的请求(即未找到服务器)返回false,没有HTTP状态代码,因为从未收到回复。

致电curl_error()


2

我有同样的问题,在我的情况下,这是因为在php.ini中禁用了curl_exec函数。检查日志:

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

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


1

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

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


1

试试这个:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

2
用可接受的答案回答较旧的问题时,重要的是指出您的答案要解决的问题的新方面。通常,仅对代码的答案也可以通过添加一些有关其工作方式和原因的解释加以改进。同样,在建议某人禁用安全性时,非常重要的是要解释其原因和风险。
杰森·艾勒

尽管此代码可以回答问题,但提供有关如何和/或为什么解决问题的其他上下文将提高​​答案的长期价值。
唐老鸭

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/zh/function.curl-setopt.php

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.