Я пытаюсь разрешить нашим пользователям загружать zip-файл с помощью принудительной загрузки php. У меня возникли проблемы с завершением загрузки, и оказалось, что zip-файл сжимался и отправлялся в браузер, тогда заголовок с длиной содержимого остановил загрузку до ее завершения (потому что сжатие zip-файла увеличивает размер файла) поэтому я добавил это в свой код:
if(ini_get('zlib.output_compression')) {
ini_set('zlib.output_compression', 'Off');
}
После добавления загруженные zip-файлы можно было открыть, но заголовок Content-Length больше не отправлялся. Я проверил заголовки, которые были отправлены с помощью firebug, и у загрузок больше не было индикатора выполнения. Я не уверен, работают ли загрузки, потому что они больше не архивируются или потому что заголовок длины содержимого больше не отправляется (а файл gzip большего размера загружается полностью). Мне также интересно, почему добавление этих трех строк приведет к исчезновению заголовка длины содержимого?
вот раздел, который заставляет загрузку:
if(ini_get('zlib.output_compression')) {
ini_set('zlib.output_compression', 'Off');
}
// Display the download
ob_end_clean();
header('Content-Description: File Transfer');
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="'.$name.'.zip"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($archive));
flush();
readfile($archive);
Не передавайте файл через приложение PHP, это очень неэффективно. Именно для этого вы можете легко использовать встроенные функции Nginx. Это называется X-Accel-Redirect
и это заголовок, который вам нужно вернуть из PHP. Nginx увидит его и отправит файл в браузер, в то время как ваш PHP-процесс уже свободен для обслуживания других запросов.
Документация Вот
Я понял, что после отключения gzip в php мои настройки nginx затем использовали gzip для его сжатия, так как у них обоих был включен gzip. Мне пришлось добавить новый заголовок, который установил кодировку содержимого как application / zip, чтобы nginx не пытался сжать его с помощью gzip. Я добавил эту строку кода:
header('Content-Encoding: application/zip');
Выполните одно из следующих действий:
Честно говоря, я не знаю, почему это так работает. Путешествие на bugs.php.net наверняка что-нибудь обнаружит.