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_includeallow_url_fopenfile_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的主要内容,如果未能解决你的问题,请参考以下文章

php中的file_get_contents或curl?

PHP CURL替换file_get_contents

PHP使用curl替代file_get_contents

php curl和file_get_contents读不到数据

PHP cURL 应用

无法让 cURL 或 file_get_contents 在 PHP 中工作