У меня есть следующий скрипт, который позволяет посетителю загружать файл:
header( 'Content-Type: application/octet-stream' ); header( 'Content-Transfer-Encoding: binary' ); header( 'Content-Disposition: attachment; filename=' . $fileName ); header( 'Content-Length: ' . filesize( $filePath ) ); header( 'Content-Description: Download' ); header( 'Cache-Control: private' ); header( 'Pragma: no-cache' ); header( 'Expires: 0' ); readfile( $filePath ); exit();
Это не работает очень хорошо. (Я также поставил имя файла в кавычки, тот же результат).
Он ведет себя очень медленно, и иногда загрузки даже останавливаются. В Opera, особенно, он останавливается на 99% загрузки. Иногда он даже сразу показывает 99% завершен, затем он начинает загружаться и останавливается примерно на 34%.
Сервер является общим хостом, сервером Mac OS X.
С помощью добавления HTML-заголовков Firefox в HTTP я заметил, что сервер добавляет заголовки заголовков в ответ:
HTTP/1.1 200 OK Date: Thu, 18 Feb 2010 09:27:25 GMT Server: Apache X-Powered-By: PHP/5.2.12 Content-Transfer-Encoding: binary Content-Disposition: attachment; filename=test.psd Content-Length: 398635 Content-Description: Download Cache-Control: private Pragma: no-cache Expires: 0 Content-Encoding: gzip // <-- expecially this one, Vary: Accept-Encoding // <-- this one, MS-Author-Via: DAV // <-- and this one Keep-Alive: timeout=10, max=100 Connection: Keep-Alive Content-Type: application/octet-stream
Может ли это быть причиной проблемы?
Когда я запускаю скрипт на своем локальном хосте, все работает нормально. Кроме того, когда я напрямую загружаю файлы с этого хоста, скорость также прекрасная и плавная.
Я действительно довольно невежественна в этом. Ваша помощь вызвана. Заранее спасибо.
ОБНОВИТЬ:
Я думаю, что я сузил проблему до узкого места. Веб-сервер автоматически gzip сжимает вывод. Когда я удалял заголовок Content-Length
из моего PHP-скрипта, все начиналось плавно. Это имеет смысл: значение Content-Length
больше не соответствует фактическому выпуску gzipped. В PHP я читал несжатый файл для установки заголовка Content-Length
, но потом Apache сжимает его, и это, вероятно, там, где браузер задыхается.
Я рассмотрю этот вопрос с вопросом о том, как установить правильный размер заголовка Content-Length
когда веб-сервер автоматически gzip сжимает выходные данные.