无法恢复大于300M的下载

时间:2011-01-22 08:44:11

标签: php download buffer resume-download

我正在使用php下载文件的程序。 脚本请求如下:http://localhost/download.php?file=abc.zip 我使用了Resumable downloads when using PHP to send the file?

中提到的一些脚本

它绝对适用于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 ..但是当我使用多线程下载文件时它可以工作

1 个答案:

答案 0 :(得分:0)

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

我还会检查我的网络服务器(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);