我的 cURL 代码有啥问题(http 状态为 0)吗?

Posted

技术标签:

【中文标题】我的 cURL 代码有啥问题(http 状态为 0)吗?【英文标题】:Anything wrong with my cURL code (http status of 0)?我的 cURL 代码有什么问题(http 状态为 0)吗? 【发布时间】:2011-06-02 00:59:30 【问题描述】:

即使我将发送的 url 复制并粘贴到浏览器中,状态始终为 0,但我会立即得到一个 json 对象

<?php


$mainUrl = "https://api.xxxx.com/?";
$co = "xxxxx";
$pa = "xxxx";
$par = "xxxx";
$part= "xxxx";
$partn = "xxxx";
$us= "xxx";
$fields_string;
$fields = array(
            'co'=>urlencode($co),
            'pa'=>urlencode($pa),
            'par'=>urlencode($par),
            'part'=>urlencode($part),
            'partn'=>urlencode($partn),
            'us'=>urlencode($us)
            );

foreach($fields as $key=>$value)  $fields_string .= $key . '=' . $value . '&' ;

$fields_string = rtrim($fields_string, "&");
$fields_string = "?" . $fields_string;

$url = "https://api.xxxxx.com/" . $fields_string;

$request =  $url; 

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT,'3');
$content = trim(curl_exec($ch));
$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);

curl_close($ch);
print $url;
print $http_status;
print $content; 



?>

【问题讨论】:

只是一个无关的旁注:PHP 有一个非常方便的http_build_query 函数。 php.net/manual/en/function.http-build-query.php https,有没有返回错误? 是的,刚刚意识到检查错误会很有帮助。 【参考方案1】:

意识到我遇到了 SSL 问题。只需将 CURLOPT_SSL_VERIFYPEER 和 CURLOPT_SSL_VERIFYHOST 设置为 false。有效。

【讨论】:

如果您希望使用 SSL,您可以添加 CURLOPT_CAINFO 标志并指向证书。比如'curl_setopt($curl, CURLOPT_CAINFO, BASE_DIR .'/certs/cacert.pem');' @Xoc:+1 来自我指出这里可以选择安全连接。【参考方案2】:

仅供参考,如果 curl 连接在远程服务器返回数据之前超时,您也可以获得状态代码 0。在这种情况下,您需要设置 curl 超时选项以避免这种情况。只是为其他有状态 0 问题的人发布此内容。

【讨论】:

这里有关于如何设置 curl 超时的详细信息***.com/a/11066378/243233【参考方案3】:

我遇到了同样的问题,您必须先运行 curl_exec($ch) 命令,然后再运行 curl_getinfo($ch) 命令。

【讨论】:

完美!这就是我的问题!【参考方案4】:

所以试试这个你会得到积极的结果我已经将 CURLOPT_SSL_VERIFYPEER 和 CURLOPT_SSL_VERIFYHOST 添加到 false

<?php


$mainUrl = "https://api.xxxx.com/?";
$co = "xxxxx";
$pa = "xxxx";
$par = "xxxx";
$part= "xxxx";
$partn = "xxxx";
$us= "xxx";
$fields_string;
$fields = array(
            'co'=>urlencode($co),
            'pa'=>urlencode($pa),
            'par'=>urlencode($par),
            'part'=>urlencode($part),
            'partn'=>urlencode($partn),
            'us'=>urlencode($us)
            );

foreach($fields as $key=>$value)  $fields_string .= $key . '=' . $value . '&' ;

$fields_string = rtrim($fields_string, "&");
$fields_string = "?" . $fields_string;

$url = "https://api.xxxxx.com/" . $fields_string;

$request =  $url; 

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT,'3');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
$content = trim(curl_exec($ch));
$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);

curl_close($ch);
print $url;
print $http_status;
print $content; 



?>

【讨论】:

【参考方案5】:

在调试 curl 时,您应该始终设置选项 CURLOPT_VERBOSE。您的超时值看起来很低。

【讨论】:

以上是关于我的 cURL 代码有啥问题(http 状态为 0)吗?的主要内容,如果未能解决你的问题,请参考以下文章

cURL 有啥用? [关闭]

PHP获取访问页面HTTP状态码的实现代码

HTTP 状态码 200(缓存)与状态码 304 有啥区别?

PHP CURL 跟随重定向以获取 HTTP 状态

linux中shell curl命令获取http状态码

通过curl命令获取http的状态吗