【问题标题】:Cannot resume downloads bigger than 300M无法恢复大于 300M 的下载
【发布时间】:2011-06-13 14:35:51
【问题描述】:

我正在开发一个使用 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..但是当我使用多线程下载文件时它可以工作

【问题讨论】:

    标签: php download buffer resume-download


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-07-08
      • 2016-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      相关资源
      最近更新 更多