2012-06-05 3 views
1

Я не уверен, что это проблема 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 не должны быть затронуты лимитом памяти, и я проверил, что выходная буферизация отключена, почему большие файлы вызывают эту (новую) проблему?

+1

Выключена ли буферизация вывода? (Это единственная возможная проблема с памятью, на странице руководства на readfile() упоминается) –

+0

Итак, что это? 500 или 505? (505 не имеет смысла.) – Ryan

+2

Возможно, PHPs memory_limit. Что он настроил? – mario

ответ

1

Разрешение было простым (после рабочего времени).

php_value output_buffering 0 

добавлен в конфигурацию виртуального хоста Apache.

Кажется, что независимо от того, что ob_get_level() сказал, буферизация вывода имела место. Другими словами, достаточно использовать буферизацию вывода достаточно, чтобы повлиять на использование памяти PHP.

Смежные вопросы