Кэширование HTTP-ответов, когда они динамически создаются PHP

Я думаю, что мой вопрос кажется довольно случайным, но терпите меня, так как он становится интересным (по крайней мере, для меня :)).

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

Идеальной стратегией было бы использование заголовка запроса «If-None-Match» и заголовка ответа «ETag» для реализации системы обратного прокси-кэша. Несмотря на то, что я знаю это далеко, я не уверен, возможно ли это или что я должен вернуть в качестве ответа для реализации этой техники!

 Mehran10 июл. 2013 г., 16:49
Я уже там, но дело в том, что у меня почти нет времени что-либо публиковать. Сожалею
 Mehran10 июл. 2013 г., 15:08
Не будь так уверен, владельцем этого глаза теперь является Джинчуурики Джуби!
 Madara Uchiha♦09 июл. 2013 г., 11:30
Холодный глаз. Все еще не подходит для моего хотя.
 Madara Uchiha♦10 июл. 2013 г., 15:11
Пока, но мой козырь еще не раскрыт. Давайте продолжим этот чат над Аниме и Манга чат. Чтобы не загромождать эту тему.

Ответы на вопрос(1)

Решение Вопроса

- не совсем то, для чего он создан.

Вместо этого посмотри на X-Accel для nginx, X-Sendfile для Lighttpd или Mod_xsendfile для Апача.

Первоначальный запрос обрабатывается PHP, но как только файл загрузки определен, он устанавливает несколько заголовков, чтобы указать, что сервер должен обрабатывать отправку файла, после чего процесс PHP освобождается для обслуживания чего-то другого.

Затем вы можете использовать веб-сервер для настройки кэширования.

Статический контент

Если ваш контент сгенерирован из PHP и особенно дорог в создании, вы можете записать вывод в локальный файл и снова применить описанный выше метод.

Если вы не можете писать в локальный файл или не хотите, вы можете использовать HTTP-заголовки ответа для управления кэшированием:

Expires: <absolute date in the future>
Cache-Control: public, max-age=<relative time in seconds since request>

Это приведет к тому, что клиенты будут кэшировать содержимое страницы до его истечения или когда пользователь принудительно перезагрузит страницу (например, нажмите F5).

Динамически генерируемый контент

Для динамического контента вы хотите, чтобы браузер проверял вас каждый раз, но отправлял содержимое страницы, только если есть что-то новое. Вы можете сделать это, установив несколько других заголовков ответа:

ETag: <hash of the contents>
Last-Modified: <absolute date of last contents change>

Когда браузер снова пингует ваш скрипт, они добавят соответственно следующие заголовки запроса:

If-None-Match: <hash of the contents that you sent last time>
If-Modified-Since: <absolute date of last contents change>

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

TheLast-Modified проще всего применять, если у вас есть локальные файловые кэши (файлы имеют дату изменения). Простое условие заставляет его работать:

if (!file_exists('cache.txt') || 
    filemtime('cache.txt') > strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
    // update cache file and send back contents as usual (+ cache headers)
} else {
    header('HTTP/1.0 304 Not modified');
}

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

 Ja͢ck15 мая 2012 г., 09:45
@ MehranZiadloo Возможно, вы не получили мой ответ, я перефразировал его.
 Mehran15 мая 2012 г., 10:43
Спасибо, "304 Не модифицированный" сделал свое дело
 Mehran15 мая 2012 г., 09:52
Даже несмотря на то, что ваше обновление прояснило вашу точку зрения, но я боюсь, что все еще невозможно устранить PHP, поскольку контент иногда генерируется, а не загружается. Спасибо, в любом случае
 Ja͢ck15 мая 2012 г., 10:03
Обновил ответ снова. Вы заявили, что «целью является чтение файла из файловой системы», поэтому вам следует прояснить это:)
 Mehran15 мая 2012 г., 09:43
Это мое плохое, что я забыл упомянуть, исключить PHP невозможно. В PHP может быть сложная логика.

Ваш ответ на вопрос