访问REST API时,这两段代码有何不同?
$result = file_get_contents('http://api.bitly.com/v3/shorten?login=user&apiKey=key&longUrl=url');
和
$ch = curl_init('http://api.bitly.com/v3/shorten?login=user&apiKey=key&longUrl=url');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
从
判断,它们都产生相同的结果print_r(json_decode($result))
答案 0 :(得分:110)
file_get_contents()
是一把简单的螺丝刀。非常适合简单的GET请求,其中标头,HTTP请求方法,超时,cookiejar,重定向和其他重要事项无关紧要。
fopen()
是您可以想到的每个位和选项的powerdrills。
答案 1 :(得分:20)
除此之外,由于最近的一些网站黑客行为,我们必须更多地保护我们的网站。在这样做时,我们发现 file_get_contents 无法正常工作, curl 仍然有效。
不是100%,但我相信这个php.ini设置可能阻止了 file_get_contents 请求。
; Disable allow_url_fopen for security reasons
allow_url_fopen = 0
无论哪种方式,我们的代码现在都可以使用 curl 。
答案 2 :(得分:15)
这是一个古老的主题,但在我对我的API的最后一次测试中,cURL更快更稳定。有时,较大请求的file_get_contents需要超过5秒,而cURL只需要1.4到1.9秒,而且速度要快一倍。
我需要在此添加一条注释,我只是发送GET并重新接收JSON内容。如果你正确设置cURL,你会得到很好的回应。只是"告诉" cURL你需要发送什么,你需要什么,以及它。
在你的例子中我想做这个设置:
$ch = curl_init('http://api.bitly.com/v3/shorten?login=user&apiKey=key&longUrl=url');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json'));
$result = curl_exec($ch);
此请求将以0.01秒的最大值返回数据