2012-02-07 2 views
2

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

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

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

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

+0

У меня такое чувство, что PHP не лучший способ кэшировать файлы. Я бы попытался найти решение, запеченное на сервере, или прокси-сервер кэширования. Вот [Руководство по кэшированию Apache] (http://httpd.apache.org/docs/2.2/caching.html). – grossvogel

+0

grossvogel, это, к сожалению, невозможно. – cweiske

ответ

3

Использование обратного прокси, такого как 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 и директиву максимального возраста, директива максимального возраста , переопределяет заголовок Expires, даже если заголовок Expires является более ограничительным. Это правило позволяет серверу происхождения предоставить для данного ответа более длительное время истечения времени для кеша HTTP/1.1 (или более позднего), чем для кеша HTTP/1.0. Это может быть полезно, если определенные кеши HTTP/1.0 неправильно вычисляют возраст или время истечения срока действия, возможно, из-за десинхронизированных часов.

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

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

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

«Надежда, что помогает :)