【问题标题】:PHP cURL vs file_get_contentsPHP cURL 与 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 数据,只要您使用支持流上下文的版本。

标签: php curl file-get-contents


【解决方案1】:

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

带有stream contextfopen() 或带有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 ;)
猜你喜欢
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多