Curl不返回任何函数,但返回终端中的json对象。怎么调试?

时间:2015-02-23 00:05:17

标签: php json curl

这是我尝试从中获取内容的网址:

$url = 'http://mgcash.com/api/?a=get_offers&key=13658244dad4cfb3&country=US&ua=Mozilla/5.0%20%28Macintosh;%20Intel%20Mac%20OS%20X%2010.10;%20rv:35.0%29%20Gecko/20100101%20Firefox/35.0&format=json';

所以我尝试file_get_contents()并且那个工作正常。然后我尝试了这个始终有效的功能,但不是在这种情况下。

class SimpleCurl 
{

    public static function get($url, $params=array()) 
    {
        $url = $url . '?' . http_build_query($params, '', '&');
        $ch = curl_init();

        $options = [
            CURLOPT_URL             => $url,
            CURLOPT_RETURNTRANSFER  => true,
            CURLOPT_CONNECTTIMEOUT  => 10,
            CURLOPT_SSL_VERIFYPEER  => false
        ];
        curl_setopt_array($ch, $options);

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

        return $response;
    }

}

然后我尝试使用以下命令终端:

curl -X GET "http://mgcash.com/api/?a=get_offers&key=13658244dad4cfb3&country=US&ua=Mozilla/5.0%20%28Macintosh;%20Intel%20Mac%20OS%20X%2010.10;%20rv:35.0%29%20Gecko/20100101%20Firefox/35.0&format=json"

这很有效。它返回了正确的JSON对象,没有任何问题。 任何人都可以让我知道你如何调试CURL并找出这里的问题是什么?

经过进一步测试和调试后,我发现了以下内容。由于我的项目需要JSON对象,因此我传递了获取的CURL $content trough $json_data = json_decode($content);并且它什么也没有返回。空白!

但是,如果我在echo之前尝试print_rjson_decode(),我可能会获得一些RAW信息/文本,而不是JSON对象。什么......

2 个答案:

答案 0 :(得分:3)

您没有将$params传递给get函数,$url最终会像http://mgcash.com/api/?a=get_offers&key=13658244dad4cfb3&country=US&ua=Mozilla/5.0%20%28Macintosh;%20Intel%20Mac%20OS%20X%2010.10;%20rv:35.0%29%20Gecko/20100101%20Firefox/35.0&format=json一样?请注意附加的?

您可以将get函数更改为仅在$params不为空时连接查询字符串,如下所示:

...
if (!empty($params)){     
   $url = $url . '?' . http_build_query($params, '', '&');
} 

答案 1 :(得分:1)

您应该使用CURLOPT_VERBOSE输出调试信息:

  

CURLOPT_VERBOSE - 输出详细信息时为TRUE。将输出写入STDERR,或使用CURLOPT_STDERR指定的文件。

虽然如果您在浏览器中运行脚本,但您不会看到详细日志,因为默认情况下它会将所有信息输出到stderr(通常可以在{{1}中看到该输出})。

因此,要查看记录的信息,您应该查看error.log,在终端中运行脚本,或者为cURL提供另一个文件处理程序以输出日志。在最简单的情况下,您可以将输出重定向到error.log,如下所示:

stdout

在这种情况下,您会在浏览器中看到您的日志。或者,您也可以向$options = [ CURLOPT_VERBOSE => true, CURLOPT_STDERR => fopen('php://stdout', 'w'), ... ]; 提供任何其他文件名,以便将日志输出到文件中。

参考:http://php.net/manual/en/function.curl-setopt.php