PHP проходит медленно - PullRequest
3 голосов
/ 16 июня 2009

По разным причинам мне нужно играть посредника между HTTP-запросом и файлом на диске. Мой подход состоял в том, чтобы заполнить заголовки и затем выполнить файл чтения ('/ path / to / file.jpg');

Теперь все работает нормально, за исключением того, что очень медленно возвращает даже изображение среднего размера.

Может ли кто-нибудь предоставить мне более эффективный способ потоковой передачи файла клиенту после отправки заголовков?

Примечание: это окно Linux в среде общего хостинга, если это имеет значение

Ответы [ 4 ]

3 голосов
/ 16 июня 2009

Несколько веб-серверов позволяют внешнему скрипту сказать им, что именно это и нужно. X-Sendfile на Apache (с mod_xsendfile) равен единице.

Короче говоря, все, что вы отправляете, это заголовки. Специальный заголовок X-Sendfile инструктирует веб-сервер отправлять указанный файл в качестве тела ответа.

0 голосов
/ 16 июня 2009

Это должно быть довольно быстро. Мы сделали это с большими изображениями без проблем. Делаете ли вы что-то еще до вывода изображения, которое может замедлить процесс, например, вычисление метаданных на изображении?

Edit: Вам может потребоваться очистить вывод и использовать fread. IE:

$fp = fopen($strFile, "rb");
//start buffered download
while(!feof($fp))
    {
    print(fread($fp,1024*16));
    flush();
    ob_flush();
    }
fclose($fp);
0 голосов
/ 16 июня 2009

По сути, вы хотите построить сервер ... Это не тривиально.

Существует очень многообещающий проект сервера на базе PHP: Nanoweb .

Это бесплатно и полностью расширяемо.

0 голосов
/ 16 июня 2009

Вы можете начать с реализации поддержки условных запросов GET.

Отправьте заголовок «Last-Modified» с файлом и ответьте «304 Not Modified» всякий раз, когда клиент запрашивает файл с «If-Modified-Since», и вы видите, что файл не был изменен. Некоторая разумная информация о свежести (через заголовки «Cache-Control» / «Expires») также рекомендуется для предотвращения повторных запросов о неизменном ресурсе.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...