【问题标题】:Why does cURL always return a status code?为什么 cURL 总是返回状态码?
【发布时间】:2011-07-27 17:08:37
【问题描述】:

我有一些调用 cURL 库的 PHP 代码。我正在使用它来获取 JSON 数据。

我已将 cURL opt 'CURLOPT_RETURNTRANSFER' 设置为 1,但仍获得状态码..

代码如下:

<?php
function fetch_page($url)
{

    $ch = curl_init();

    $array = array(
        'include'=>'ayam'
    );

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $array);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    $result = curl_exec ($ch);
    curl_close ($ch);

    return $result;
} 

$return  = fetch_page(MY_LINK_URL);

echo json_decode($return);
?>

【问题讨论】:

    标签: php curl


    【解决方案1】:

    CURLOPT_RETURNTRANSFER 可以忽略的原因似乎有很多,SSL 证书检查只是其中之一:

    就我而言,罪魁祸首是CURLOPT_POST,我将其设置为true。我期待得到一个由 HTTP 响应标头和响应本身组成的字符串。相反,我得到了状态码1。去搞清楚。谢天谢地,我不需要 HTTP 标头,所以我的解决方案是:

    curl_setopt($ch, CURLOPT_HEADER, false);
    

    如果我确实需要标题信息,我不知道该怎么做。我浪费了大量时间来追踪问题。

    该死的 PHP 卷曲! (愤怒地挥舞着拳头)

    【讨论】:

      【解决方案2】:

      这看起来是正确的。我其实也有同样的问题,但是当我添加时

      curl_setopt($ch,  CURLOPT_RETURNTRANSFER, 1);
      

      它正确返回 json 代码,而不是返回 1(True)。

      【讨论】:

        【解决方案3】:

        代码看起来完全正确。在返回它之前尝试var_dump($result),看看它到底是什么。

        另外,将CURLOPT_HEADER 设置为 1 并在浏览器中检查输出的视图源;这两个都可以帮助调试问题。如果我们可以更有效地提供帮助,请编辑问题并发布结果。

        更新:既然你用的是HTTPS,也加一下

        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        

        【讨论】:

        • @pensilhijau:看看更新,也许会有所帮助?
        【解决方案4】:

        根据PHP docs

        成功时返回 TRUE,否则返回 FALSE 失败。但是,如果 CURLOPT_RETURNTRANSFER 选项已设置, 它会在成功时返回结果, 失败时为 FALSE。

        所以这意味着你应该得到 成功:结果 失败:FALSE(回显为 0)

        另外,如果您正在获取 JSON,并且需要访问它,请使用 json_decode() 而不是 json_encode()。

        【讨论】:

          【解决方案5】:

          可能有类似的问题: - cURL on local dev network problem with virtual host naming

          在你关闭你的 curl 句柄输出之前:

          $result = curl_exec ($ch);
          print_r(curl_getinfo($ch));
          curl_close ($ch);
          

          这是我绕过虚拟主机的解决方案

          // This is your Virtual Hosts name
          $request_host   = 'dev.project'; 
          
          // This is the IP
          $request_url    = '192.168.0.1';
          
          $headers = array("Host: ".$request_host);
          curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);     
          curl_setopt($ch, CURLOPT_URL, $request_url.'?'.$request_args);
          curl_setopt($ch, CURLOPT_HEADER, FALSE);
          

          【讨论】:

            【解决方案6】:

            好吧,您应该告诉我们您所指向的网址(以及您正在运行的 php 版本)。 我在“www.google.com”上尝试过使用 php 5.3,它按预期工作($result 包含整个网页)

            【讨论】:

            • 我指向的网址是使用https,有问题吗?我使用 php 5.1
            • 不,应该没问题...你完全确定你指向的页面没问题吗?
            猜你喜欢
            • 2021-10-23
            • 2016-04-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多