这是我试图从中获取内容的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()
通过之前尝试echo
或print_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