繁体   English   中英

PHP cURL HTTP 代码返回 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);

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

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

调用curl_error()

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

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

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

# setsebool -P httpd_can_network_connect on

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

首先curl_exec然后curl_getinfo

$response = curl_exec($ch); 
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

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

对我来说,发出 URL,直到我编码了 url 参数值,我得到了 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 查询中的参数值必须进行百分比编码。 我知道这不是什么大问题,但我遇到过这样的情况,我在这里的答案中看不到它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM