Кеширование HTTP файлов с помощью PHP - PullRequest
2 голосов
/ 07 февраля 2012

Я пишу библиотеку, которая запрашивает файлы через HTTP и HTTPS.Чтобы сократить трафик на часто запрашиваемые URL-адреса, я хочу кэшировать извлеченные файлы и соблюдать их настройки кэша.

Теперь истечение срока действия кэша кажется трудным делом, поскольку HTTP RFC определяют такмногие из них должны быть проверены во всех возможных комбинациях:

  • Expires
  • Cache-Control (с десятками возможных значений)
  • Pragma

Я могу представить, что кто-то уже написал PHP-код, который правильно реализует все эти вещи.Где это?

Ответы [ 3 ]

3 голосов
/ 08 февраля 2012

Вы правы: кто-то уже сделал это:)

PHP Framework Symfony2 поставляется с кэширующим обратным прокси в составе стандартного дистрибутива.Документы здесь: http://symfony.com/doc/2.0/book/http_cache.html

3 голосов
/ 08 февраля 2012

Использование обратного прокси-сервера, такого как Squid, Varnish или даже Apache mod_cache, очень поможет вам в отношении HTTP-заголовков, связанных с кэшем.Однако, если вам нужна полная версия PHP, вы должны соблюдать Cache-Control, а затем Expires, потому что, когда Cache-Control и Expires доступны в одном и том же HTTP-ответе, Cache-Control имеет приоритет с атрибутом «max-age», как описано в http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3:

Если ответ содержит заголовок Expires и директиву max-age, директива max-age переопределяет заголовок Expires, даже если заголовок Expires более ограничивающий.Это правило позволяет исходному серверу предоставлять для данного ответа более длительное время истечения для кэша HTTP / 1.1 (или более поздней), чем для кэша HTTP / 1.0.Это может быть полезно, если некоторые кэши HTTP / 1.0 неправильно рассчитывают возраст или время истечения срока действия, возможно, из-за десинхронизированных часов.

Вы также должны быть очень осторожны с атрибутом no-cache, который является своего родавводит в заблуждение, так как требует повторной проверки с сервером происхождения, поэтому он немного похож на заголовок «хранить, но не обслуживать из кэша без повторной проверки».

Вы также можете игнорироватьЗаголовок Pragma по двум причинам:

  • это заголовок запроса, а не заголовок ответа
  • это для HTTP 1.0 и (почти весь) мир теперь HTTP 1.1:)

'Надеюсь, это поможет:)

0 голосов
/ 10 января 2014

Использование Guzzle с HTTP Cache Plugin будет лучшим решением IMO.

...