Curl在函数中不返回任何内容,但在终端中返回json对象.如何调试


Curl returns nothing with a function, but returns json object in terminal. How to debug?

这是我试图从中获取内容的URL:

$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对象,我通过$json_data = json_decode($content);传递获取的CURL $content,但它什么也不返回。空白的

但是,如果我在json_decode()通过之前尝试echoprint_r,我会意外地得到一些RAW信息/文本,而不是JSON对象。什么。。。

您没有将$params传递给get函数,$url的结果如下http://mgcash.com/api/?a=get_offers&key=13658244dad4cfb3&country=US&ua=Mozilla/5.0%20%28Macintosh;%20英特尔%20Mac%20OS%20X%2010.10;%20rv:35.0%29%20Gecko/20100101%20Firefox/35.0&format=json?注意所附的?

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

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

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

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

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

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

$options = [
    CURLOPT_VERBOSE => true,
    CURLOPT_STDERR => fopen('php://stdout', 'w'),
    ...
];

在这种情况下,你会在浏览器中看到你的日志。或者,您也可以向fopen提供任何其他文件名,以在文件中输出日志。

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