Надежная загрузка больших файлов в PHP - PullRequest
24 голосов
/ 28 февраля 2009

У меня есть php-скрипт на сервере для отправки файлов получателям: они получают уникальную ссылку, а затем они могут загружать большие файлы. Иногда возникает проблема с передачей, и файл поврежден или никогда не заканчивается. Мне интересно, есть ли лучший способ отправить большие файлы

Код:

$f = fopen(DOWNLOAD_DIR.$database[$_REQUEST['fid']]['filePath'], 'r');
while(!feof($f)){
    print fgets($f, 1024);
}
fclose($f);

Я видел такие функции, как

http_send_file
http_send_data

Но я не уверен, будут ли они работать.

Как лучше всего решить эту проблему?

Привет
erwing

Ответы [ 13 ]

0 голосов
/ 01 ноября 2012

У меня была такая же проблема, моя проблема решена путем добавления этого перед началом сессии session_cache_limiter ( 'ни');

0 голосов
/ 04 ноября 2011

Я использовал следующий фрагмент, найденный в комментариях к записи php для readfile:

function _readfileChunked($filename, $retbytes=true) {
    $chunksize = 1*(1024*1024); // how many bytes per chunk
    $buffer = '';
    $cnt =0;
    // $handle = fopen($filename, 'rb');
    $handle = fopen($filename, 'rb');
    if ($handle === false) {
        return false;
    }
    while (!feof($handle)) {
        $buffer = fread($handle, $chunksize);
        echo $buffer;
        ob_flush();
        flush();
        if ($retbytes) {
            $cnt += strlen($buffer);
        }
    }
    $status = fclose($handle);
    if ($retbytes && $status) {
        return $cnt; // return num. bytes delivered like readfile() does.
    }
    return $status;
}
0 голосов
/ 23 января 2010

Я не уверен, что это хорошая идея для больших файлов. Если поток для вашего сценария загрузки работает до тех пор, пока пользователь не завершит загрузку, а вы запускаете что-то вроде Apache, только 50 или более одновременных загрузок могут привести к сбою на вашем сервере, потому что Apache не предназначен для запуска большого количества долго работающих темы одновременно. Конечно, я могу ошибаться, если поток apache как-то завершается, и загрузка находится в буфере где-то в процессе загрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...