Я не уверен, что это проблема PHP, проблема с конфигурацией сервера или аппаратная проблема, но я думал, что начну с PHP и посмотрю, есть ли какие-либо предложения. Этот код работал нормально до недавнего времени, и я не знаю никаких изменений конфигурации, которые могли бы вызвать это. Недавно мы обновили версию Debian Lenny до Squeeze (и с PHP 5.2 до 5.3), но код отлично работает на другом сервере Squeeze.500 ошибка при загрузке файлов более 63 МБ
У меня есть немного кода PHP, который берет путь к файлу, переданному как переменная GET (переписан через mod_rewrite от запроса до http://site.com/request/for/file.pdf до http://site.com/downloader.php?path=/path/to/file.pdf). Причина этого связана с отслеживанием статистики.
Файл передается по этому битовому коду (упрощенному для удобочитаемости).
if(is_readable($theFile)) {
//$fh= fopen($theFile, "r");
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
header("Pragma: no-cache");
header("Content-Type: application/pdf");
header("Content-Disposition: attachment; filename=\"".basename($theFile)."\"");
header("Content-Length:".(string)(filesize($theFile)));
sleep(1);
//fpassthru($fh);
readfile($theFile);
}
Как вы можете видеть, только код запускается на выполнение, если файл доступен для чтения (то есть путь, все правильно). Для файлов размером около 63 МБ все работает нормально. Для чего-либо более 63 МБ сервер возвращает ошибку 500. (Это сообщается в Firefox/Chrome как «файл не найден», когда я предполагаю, что это должна быть «внутренняя ошибка сервера», но это другая история, которую я думаю). В журналах ошибок Apache ничего нет.
Может кто-нибудь подумать о любой конфигурации сервера PHP или Apache, которая может привести к этому? Насколько я знаю, пределы памяти PHP не должны затрагиваться readfile или fpassthru. Я отмечаю, что мой предел памяти PHP составляет 64 МБ, однако отключение перенаправления mod_rewrite к PHP не устраняет проблему. Файлы все равно не будут загружаться.
Большое спасибо за любые предложения.
ОБНОВЛЕНО * * ** * ** * ** *
Итак, я увеличил лимит памяти PHP от 64Мб до 200Мб. Это позволяет загружать файлы до 200 МБ. Однако вопрос остается. Учитывая, что readfile и fpassthru не должны быть затронуты лимитом памяти, и я проверил, что выходная буферизация отключена, почему большие файлы вызывают эту (новую) проблему?
Выключена ли буферизация вывода? (Это единственная возможная проблема с памятью, на странице руководства на readfile() упоминается) –
Итак, что это? 500 или 505? (505 не имеет смысла.) – Ryan
Возможно, PHPs memory_limit. Что он настроил? – mario