Я написал простой 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.