Загрузка файла через PHP прерывается на Dreamhost - PullRequest
0 голосов
/ 21 февраля 2012

Я написал простой PHP-скрипт для загрузки скрытого файла, если у пользователя правильная аутентификация. Вся установка работает отлично: она отправляет правильные заголовки, и передача файлов начинается просто отлично (и заканчивается просто отлично - для небольших файлов).

Однако, когда я пытаюсь обработать файл размером 150 МБ, соединение таинственно прерывается где-то ближе к середине файла. Вот соответствующий фрагмент кода (взятый из Интернета и адаптированный мной):

    function readfile_chunked($filename, $retbytes = TRUE) {
    $handle = fopen($filename, 'rb');
    if ($handle === false) return false;
    while (!feof($handle) and (connection_status()==0)) {
        print(fread($handle, 1024*1024));
        set_time_limit(0);
        ob_flush();
        flush();
    }
    return fclose($handle);
}

Я также делаю некоторый другой код ДО вызова этой функции выше, чтобы попытаться решить проблему, но, насколько я могу судить, она ничего не делает:

    session_write_close();
    ob_end_clean();

    ignore_user_abort();
    set_time_limit(0);

Как видите, он не пытается сразу загрузить весь файл в память или что-то безумное. Чтобы сделать его еще более загадочным, фактическая точка передачи, где он убивает, кажется, колеблется между 50 и 110 МБ, и кажется, что все соединения с одним файлом уничтожаются в течение нескольких секунд друг от друга (попытался скачать одновременно с другом). Ничего не добавлено к прерванному файлу, и я не вижу ошибок в журналах.

Я использую Dreamhost, так что я подозреваю, что их сторожевой таймер может убить мой процесс, потому что он выполняется слишком долго. У кого-нибудь есть опыт, которым можно поделиться по этому вопросу? Может ли быть что-то еще проблема? Есть ли обходной путь?

Для справки, мой Dreamhost настроен на использование PHP 5.2.1 FastCGI.

1 Ответ

1 голос
/ 21 февраля 2012

У меня мало опыта с Dreamhost, но вы могли бы использовать mod_xsendilfe (если Dreamhost позволяет).

...