Перенаправить тело HTTP-ответа в файл - PullRequest
2 голосов
/ 15 октября 2011

Я программирую сервис, который должен принудительно загружать файл.

Я знаю возможность установки HTTP-заголовков с помощью PHP и последующей отправки файла с помощью функции readfile.Но я думаю, что это не очень хороший способ отправки больших файлов, потому что это потребовало бы большой производительности сервера, а максимальное время выполнения PHP-скриптов было бы превышено.

Так что возможно отправить HTTP-заголовки, использующие PHP (я должен изменить их в зависимости от записей в базе данных mysql.), а затем позволить Apache отправить тело файла?Я должен добавить, что я мог бы также использовать Perl-скрипты, но я также не вижу возможности сделать это в CGI-скрипте.Спасибо.

Ответы [ 3 ]

0 голосов
/ 15 октября 2011

потому что это потребовало бы большой производительности сервера

Я не верю, что это так.Пока отправка файла клиенту является последним действием, которое скрипт выполняет перед его завершением, разница в производительности ЦП / ОЗУ между отправкой файла из PHP и разрешением Apache обрабатывать его напрямую должна быть минимальной, если она вообще есть.

Если у вас на сервере слишком большое количество пропускной способности в Гбит / с с невероятно быстрой настройкой жесткого диска, вы столкнетесь с проблемой пропускной способности задолго до того, как столкнетесь с проблемой системных ресурсов сервера.

По общему признанию, это обсуждение в значительной степени основано на предположениях (поскольку я ничего не знаю о настройке вашего хостинга), поэтому YMMV.

максимальное время выполнения PHP-скриптов будет превышено

Так что просто позвоните set_time_limit(0);.Вот для чего это.

0 голосов
/ 16 октября 2011

Я нашел эту ссылку: http://jasny.net/articles/how-i-php-x-sendfile/. X-Sendfile - это модуль, который, кажется, позволяет именно то, что я хочу сделать. Он перенаправляет тело HTTP-ответа и разрешит Apache обрабатывать все. Я только что установил и попробовал его, и он отлично работает.

0 голосов
/ 15 октября 2011

Вы можете сделать это строго с Apache, если местоположение и / или тип файла загрузки известны заранее:

<Location /downloads>
    SetEnvIf Request_URI ".attachment-extension$" FILENAME=$0
    Header set "Content-disposition" "attachment; filename=%{FILENAME}"
</Location>
...