117

访问 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))
4

3 回答 3

136

file_get_contents()是一把简单的螺丝刀。非常适合标头、HTTP 请求方法、超时、cookiejar、重定向和其他重要事项无关紧要的简单 GET 请求。

fopen()带有流上下文或带有setopt的 cURL 是具有您能想到的每一位和选项的 powerdrills。

于 2012-06-16T16:00:40.797 回答
29

除此之外,由于最近的一些网站黑客攻击,我们不得不更加保护我们的网站。在这样做的过程中,我们发现file_get_contents无法工作,而curl仍然可以工作。

不是 100%,但我相信这个 php.ini 设置可能已经阻止了file_get_contents请求。

; Disable allow_url_fopen for security reasons
allow_url_fopen = 0

无论哪种方式,我们的代码现在都可以使用curl

于 2013-01-07T01:51:31.347 回答
23

这是一个老话题,但在我最后一次对我的 API 进行的测试中,cURL 更快、更稳定。有时,较大请求的 file_get_contents 需要超过 5 秒,而 cURL 只需要 1.4 到 1.9 秒,速度会快一倍。

我需要对此添加一条注释,即我只是发送 GET 并接收 JSON 内容。如果你正确设置 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.10 秒内返回数据

于 2016-05-16T14:12:37.297 回答