【问题标题】:PHP downloading questionPHP下载问题
【发布时间】:2009-12-06 20:24:20
【问题描述】:

在我的网站上,用户可以输入文件的链接,我可以通过我的服务器将下载过程流式传输给他们。我使用这样的系统:

header('Cache-control: private');
header('Content-Type: application/octet-stream'); 
header('Content-Length: ' . $r[2]);
header('Content-Disposition: filename=' . $theName);

flush();

$file = fopen($fileName, "r");
while(!feof($file))
{
    print fread($file, 10240);  
    flush();
    sleep(1);
}
fclose($fileName);

我的想法是,我的用户下载速度很慢(600kb/s)。托管的服务器位于 1Gbit 端口上,因此他们应该将互联网连接最大化十倍。

我想知道是否有更好的方法来做这种事情,也许是 cURL?我对 cURL 没有太多经验,但如果有任何反馈,我将不胜感激。

谢谢。

【问题讨论】:

  • 尝试打印一些静态字符串(循环或其他)而不是从文件中读取。这将帮助您确定磁盘访问是否是问题的原因。
  • 我认为他正在从用户指定的远程服务器实时获取数据。

标签: php curl download


【解决方案1】:

使用readfile

如果你坚持你的方法,那么这样会更有效率,没有刷新和睡眠:

while(!feof($file)) {
   print fread($file, 10240);  
}

原因如下:

  • 使用 flush() 会阻止正常的缓冲区运行,并且
  • 使用 sleep(1),您可以通过每 10 KiB 暂停 1 秒来有效地降低传输速度。

【讨论】:

    【解决方案2】:

    我不太确定你想在这里做什么.. 不明白为什么需要那个循环,特别是不明白为什么需要 sleep().. 你应该只使用 readfile 或类似的东西而不是那个循环,会很有效的

    还有你认为 curl 对你有什么帮助?

    【讨论】:

    • 我没有注意到睡眠,+1
    【解决方案3】:

    如果不是 @Sabeen Malik 指出的一秒 sleep(),则很可能是由于您的网络提供商(例如使用 mod_throttle 或 mod_bandwidth)或您正在获取的网络提供商施加的服务器端限制数据来自。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2013-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多