【问题标题】:PHP fopen and file_get_contents limited download speed, why?PHP fopen 和 file_get_contents 限制下载速度,为什么?
【发布时间】:2014-06-25 10:55:55
【问题描述】:

我正在尝试使用 PHP 检索远程文件(6MB 文本文件),我注意到使用 fopen 的速度限制为 100KB/s,而使用 file_get_contents 的速度限制为 15KB/s。

但是从服务器使用 wget 的速度在 5MB/s 以上。

是什么控制了这些速度?

我用 nethogs 检查了实时速度。

【问题讨论】:

  • 您是否考虑过使用 cURL 代替?
  • 这就是为什么它是评论而不是答案:)
  • 您是如何准确测量这些数字的?
  • 我用nethogs,我实时看速度。

标签: php fopen file-get-contents bandwidth


【解决方案1】:

wget 本身就可以很好地镜像站点,它实际上可以解析页面中的链接并下载文件。

file_get_contents 不发送“连接”HTTP 标头,因此远程 Web 服务器默认认为这是一个保持活动连接,并且直到 15 秒才会关闭 TCP 流(它可能不是标准值 -取决于服务器配置)。

如果 HTTP 负载长度达到响应 Content-Length HTTP 标头中指定的长度,普通浏览器会认为页面已完全加载。 File_get_contents 不这样做,这很遗憾。

解决方案

所以,如果你想知道解决方案,这里是:

$context = stream_context_create(array('http' => array('header'=>'Connection: close\r\n')));
file_get_contents("http://www.something.com/somepage.html",false,$context);

事情只是告诉远程网络服务器在下载完成后关闭连接,因为 file_get_contents 不够智能,无法使用响应 Content-Length HTTP 标头自行完成。

【讨论】:

  • 它不会改变速度。准确地说,仍然停留在 109KB/s。
  • 只是想补充一下,如果我打开另一个页面速度也是109KB,总共218KB/s...很奇怪,这个速度是什么决定的?
猜你喜欢
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-03
  • 2013-03-30
  • 2016-04-20
相关资源
最近更新 更多