PHP cURL与file_get_contents


111

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

2
cURL的能力远远不止于file_get_contents。那应该足够了。

18
FWIW在速度方面没有什么区别。我刚刚获取了5,000个URL,并将其HTML保存到文件中(每个文件约200k)。作为实验,我用curl做了一半,用file_get_contents做了一半,没有明显的区别。
David Gilbertson

8
只要您使用的是支持流上下文的版本,就可以使用file_get_contents发送帖子数据。
克里斯·斯特里克兰

Answers:


129

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

fopen()带有流上下文或带有setopt的 cURL 的Powerdrill带有您可以想到的每一个细节。


17
要停留在这个比喻中,请注意cURL是带有复杂钻夹头的强力钻头,需要您非常了解它才能实际进行更改(请阅读:设置cURL选项有点乏味,但可以执行您想要的任何事情)。

20
file_get_contents还允许设置上下文,这意味着您可以根据需要设置标题字段。
velop 2013年

4
除了@velop的注释外,还可以通过流上下文通过一个file_get_contents请求发送POST,PUT,身份验证,标头,内容,代理等信息
MarkusKöhler,2015年

@velop:是的。还有方法。并重定向。和超时... php.net/manual/en/context.http.php
Sz。

25

除此之外,由于最近的一些网站黑客攻击,我们不得不进一步保护我们的网站。这样做时,我们发现file_get_contents无法正常工作,而curl仍然可以正常工作。

不是100%,但我认为此php.ini设置可能已阻止了file_get_contents请求。

; Disable allow_url_fopen for security reasons
allow_url_fopen = 0

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


9
是的,file_get_contents要求allow_url_fopen诚实。
哥斯达黎加

2
是的,file_get_contents()由于许多已知使用该功能的漏洞,许多托管公司正在禁用。cURL是人们现在应该在代码中使用的功能。
frustratedtech

15
@frustratedtech这些是什么“漏洞”?
rdlowrey 2014年

3
托管公司禁用,allow_url_fopen因为他们将其误认为是allow_url_includeallow_url_fopen并且file_get_contents很好用。
fritzmg 2015年

2
@vr_driver这些链接无关file_get_contents()
rdlowrey

19

这是个老话题,但是在我对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.01秒内返回数据


1
0.1毫秒(1 / 1,000毫秒)...我很难相信。
Mark Tomlin

是。我在0.02毫秒内有一些响应,例如Twilio API电话号码检查。快。
Ivijan StefanStipić16年

4
0.02ms = 20微秒;您说的是0.1微秒,这是不对的。
Walf

2
file_get_contents 我刚刚进行一些API调用确认的速度相比,这几乎快一倍。(3个API调用)的0.8秒file_get_contents和0.49秒curl
Jsp

1
您应该使用自己的设置。然后,您的查询时间将从1.4-1.9s变为0.01s;)
Rauli Rajande
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.