112

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

10 回答 10

106

如果你连接到服务器,那么你可以从它那里得到一个返回码,否则它会失败并且你得到一个 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);
于 2012-04-19T12:50:33.107 回答
93

在 curl_exec 之后试试这个,看看有什么问题:

print curl_error($ch);

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

于 2012-04-19T12:28:30.857 回答
8

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

if(curl_errno($ch)){   
    echo 'Curl error: ' . curl_error($ch);
}
于 2014-11-20T14:22:09.283 回答
7

试试这个:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
于 2020-06-30T10:50:21.587 回答
3

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

打电话curl_error()

于 2012-04-19T12:25:48.260 回答
3

我有同样的问题,在我的情况下,这是因为 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。

于 2016-04-19T10:52:12.457 回答
2

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

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

于 2012-04-19T12:22:45.913 回答
1

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

# setsebool -P httpd_can_network_connect on
于 2020-09-10T01:51:31.043 回答
1

对我来说,发出 wat 的 URL,直到我编码了 url 参数值,我得到了 http 代码 0。

于 2021-05-16T19:57:43.090 回答
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

于 2020-04-24T01:25:04.080 回答