У меня есть следующий скрипт, позволяющий посетителю загрузить файл:
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.
С использованием дополнения Firefox Live 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
Может ли это быть причиной проблемы?
Когда я запускаю скрипт на локальном хосте, все работает нормально. Кроме того, когда я непосредственно загружаю файлы с этого хоста, скорость также нормальная и плавная.
Я действительно довольно невежественен в этом вопросе. Ваша помощь является точной. Заранее спасибо.
UPDATE:
Я думаю, что сузил проблему до узкого места. Веб-сервер GZIP автоматически сжимает вывод. Когда я удалил заголовок Content-Length
из моего PHP-скрипта, все стало загружаться гладко. Это имеет смысл: значение Content-Length
больше не соответствует фактическому сжатому выводу. В PHP я прочитал несжатый размер файла, чтобы установить заголовок Content-Length
, но после этого Apache сжимает его, и это, вероятно, там, где браузеры подавились.
Я задам этот вопрос вопросом о том, как установить правильный размер заголовка Content-Length
, когда веб-сервер автоматически сжимает выходные данные в формате gzip.