Не удается возобновить загрузку более 300M - PullRequest
0 голосов
/ 22 января 2011

Я работаю над программой с php для загрузки файлов. запрос скрипта выглядит так: http://localhost/download.php?file=abc.zip Я использую некоторый скрипт, упомянутый в Возобновляемые загрузки при использовании PHP для отправки файла?

это определенно работает для файлов до 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;
    }

}

похоже, что каждый запрошенный документ может получить только 250 МБ буфера данных до echo или print .. Но это работает, когда я использую многопоточность для загрузки файла

1 Ответ

0 голосов
/ 22 января 2011

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);
...