PHP cURL 与 file_get_contents
Posted
技术标签:
【中文标题】PHP cURL 与 file_get_contents【英文标题】:PHP cURL vs file_get_contents 【发布时间】:2012-06-19 08:50:06 【问题描述】:这两段代码在访问 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))
【问题讨论】:
cURL
的能力远远超过file_get_contents
。应该够了。
FWIW 在速度方面差别不大。我刚刚完成了 5,000 个 URL 的获取并将它们的 html 保存到文件中(每个文件大约 200k)。我用 curl 做了一半,用 file_get_contents 做了一半,没有明显的区别。
可以使用 file_get_contents 发送 post 数据,只要您使用支持流上下文的版本。
【参考方案1】:
file_get_contents()
是一个简单的螺丝刀。非常适合标头、HTTP 请求方法、超时、cookiejar、重定向和其他重要事项无关紧要的简单 GET 请求。
带有stream context 的fopen()
或带有setopt 的cURL 是具有您能想到的所有位和选项的动力钻。
【讨论】:
为了保留这个比喻,请注意 cURL 是一个带有复杂钻夹头的动力钻,需要您非常了解才能实际更改它(阅读:设置 cURL 选项有点乏味,但允许做任何你想做的事)。file_get_contents
还允许设置上下文,这意味着您可以根据需要设置标题字段。
除了@velop 的注释之外,还可以通过流上下文发送 POST、PUT、身份验证、标头、内容、代理等,并使用一个 file_get_contents 请求
@velop:是的。还有方法。并重定向。和超时...php.net/manual/en/context.http.php【参考方案2】:
除此之外,由于最近的一些网站黑客攻击,我们不得不更加保护我们的网站。在这样做的过程中,我们发现 file_get_contents 无法正常工作,而 curl 仍然可以工作。
不是 100%,但我相信这个 php.ini 设置可能已经阻塞了 file_get_contents 请求。
; Disable allow_url_fopen for security reasons
allow_url_fopen = 0
无论哪种方式,我们的代码现在都可以使用 curl。
【讨论】:
是的,file_get_contents
要求 allow_url_fopen
是真实的。
是的,许多托管公司正在禁用file_get_contents()
,因为已知有许多利用该功能的漏洞。 cURL 是人们现在应该在代码中使用的函数。
@frustratedtech 这些是什么“漏洞”?
托管公司禁用allow_url_fopen
,因为他们将其误认为allow_url_include
。 allow_url_fopen
和 file_get_contents
很好用。
@vr_driver 那些链接与file_get_contents()
无关【参考方案3】:
这是一个老话题,但在我最后一次测试我的 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.10 秒内返回数据
【讨论】:
0.1 微秒(1/1,000 毫秒)...我觉得这很难相信。 是的。我在 0.02 毫秒内有一些响应,例如 Twilio API 电话号码检查。速度很快。 0.02ms = 20 微秒;你说 0.1 微秒是不对的。 这几乎是file_get_contents
的两倍,我刚刚做了一些 API 调用来确认。 file_get_contents
为 0.8 秒,curl
为 0.49 秒(3 个 API 调用)
您应该使用自己的设置。然后您的查询将从 1.4-1.9s 变为 0.01s ;)以上是关于PHP cURL 与 file_get_contents的主要内容,如果未能解决你的问题,请参考以下文章