通过PHP从互联网流传文件速度缓慢。

7

我正在编写一个脚本,将通过我的服务器将来自Web地址的文件流式传输给用户。目前它可以正常工作,但速度非常慢。

以下是相关代码:

/* Bytes per second */
define('TRANSFER_CAP', 1048576);

/* Hard part... stream the file to the user */
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename=' . $filename);
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . $filesize);

$file = fopen($fileLocation, 'rb');
if(!$file) {
    // TODO: handle errors
}

while(!feof($file)) {
    echo fread($file, TRANSFER_CAP / 2);
    ob_flush();
    flush();

    /* Limit the download speed by sleeping */
    usleep(500);
}

这个脚本在我的本地机器上运行。当我在浏览器中请求文件(不通过脚本)时,下载速度可达到2.5MB/s,这是我的网络最大速度。然而,如果我运行脚本并尝试下载相同的文件,则只能获得约240-250KB/s的速度。
我知道不是脚本限制了传输速度,因为我将其设置为1MB/s。我也想不出这个脚本中有任何会导致速度变慢的开销较大的东西。
编辑:有趣的是,如果我改用readfile(),则几乎可以获得全部下载速度:
readfile('http://cachefly.cachefly.net/100mb.test');

所以这一定是使用和的问题吗?

不是上传,而是在这个脚本中我没有进行任何上传操作。我只是下载文件,但由于某些原因,它比我直接通过浏览器下载文件要慢很多。 - James Dawson
1
你的下载速度限制为515kb/0.0005秒,相当于1Gb/s。最好查看一下usleep() - CSᵠ
完成了,但下载速度仍然没有改变。我一开始这样做的原因是为了不一次性将1mb的数据存储在内存中,但我想这并不重要。 - James Dawson
1
我真的不认为PHP是为这种任务设计或适合的。 - EM-Creations
我同意 Em-Creations 的观点,我认为 PHP 不是最适合这项工作的工具;你能否发布一些更多关于你需要做什么以及你所运行的服务器环境的信息? - CodeMonkey
显示剩余9条评论
2个回答

0
为什么不直接使用HTTP头重定向到二进制文件呢?这样你就完全可以排除PHP,因为你只想提供文件服务。

如果我要这样做,我会直接链接到文件下载,而不是通过 PHP 脚本。我需要以这种方式执行它,有几个原因,包括监视用户下载量,这样做意味着我可以“计算字节”并得到准确的总数。 - James Dawson
为什么不从PHP中进行某种“包含”,以发送二进制数据,而不是分块读取和发送数据呢?只是随口一说。 - J. Chin

0

这不是一个选项,因为尽管我正在构建基本形式下的代理,但$fileLocation变量会根据第三方API调用而改变。因此,使用服务器端代理修改无法起作用。 - James Dawson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接