0

我正在开发一个带有 php 的程序来下载文件。脚本请求就像:我在使用 PHP 发送文件时使用了可恢复下载http://localhost/download.php?file=abc.zip 中提到的一些脚本?

它绝对适用于300M以下的文件,无论是多线程还是单线程下载,但是,当我尝试下载> 300M的文件时,我在单线程下载时遇到问题,我只下载了大约250M的数据,然后看起来像http 连接中断。它不会在断点处中断..为什么?调试脚本,我查明了它坏的地方:

$max_bf_size = 10240;
$pf = fopen("$file_path", "rb");
fseek($pf, $offset);
while(1)
{
    $rd_length = $length < $max_bf_size? $length:$max_bf_size;
    $data = fread($pf, $rd_length);
    print $data;
    $length = $length - $rd_length;
    if( $length <= 0 )
    {
        //__break-point__ 
        break;
    }

}

这似乎每个请求的文档只能获得 250M 数据缓冲区echoprint..但是当我使用多线程下载文件时它可以工作

4

1 回答 1

0

fread() 将读取您要求的字节数,因此您正在做一些不必要的工作来计算要读取的字节数。不知道你说的单线程和多线程下载是什么意思。你知道 readfile() 只是转储整个文件吗?我假设您需要从 $offset 开始读取文件的一部分,最多 $length 个字节,对吗?

如果适用,我还会检查我的 Web 服务器(Apache?)配置和 ISP 限制;您的最大响应大小或时间可能会受到限制。

尝试这个:

define(MAX_BUF_SIZE, 10240);
$pf = fopen($file_path, 'rb');
fseek($pf, $offset);
while (!feof($pf)) {
    $data = fread($pf, MAX_BUF_SIZE);
    if ($data === false)
        break;
    print $data;
}
fclose($pf);
于 2011-01-22T09:07:01.790 回答