Сегодня решил сделать то, что собирался уже давно — поставить таки кеширование скриптов у себя на сайте. Все скрипты перед отдачей пользователю собираются в один файл и сжимаются GZIP'ом — все вроде по-уму, но есть проблемка… Браузер отчаянно не хотел кешировать этот выходной скрипт.
Опытным путем было установлено, что PHP устанавливает хидеры запрета кеширования при использовании функции session_start();
Вот пример кода, который реализует кеширвоание конкретного файла (обратите внимание на три функции header(), скидывающих лишние хидеры):
Ничего особенного скрипт не делает — просто ставит в хидер дату модификации, а потом отслеживает по стандартных хидерам запроса, какая дата у закешированного файла.
Единственное дополнение — вместо filemtime() можно также использовать другую произвольную дату, в своем скрипте я использовал дату изменения самого свежего файла.
P.S. Приведенный фрагмент мною был модифицирован, чтобы учитывать сессии, но сам код взят отсюда: http://ru2.php.net/manual/ru/function.header.php#85146, а также http://foxweb.net.ru/texts/43.htm (комментарии товарища antishock).
Опытным путем было установлено, что PHP устанавливает хидеры запрета кеширования при использовании функции session_start();
Вот пример кода, который реализует кеширвоание конкретного файла (обратите внимание на три функции header(), скидывающих лишние хидеры):
- session_start(); // где-то вверху начинается сессия
-
- …
-
- function cmsCache_control($file, $time) {
-
- $etag = md5_file($file);
- $expr = 60 * 60 * 24 * 7;
-
- header("ETAG: " . $etag);
- header("LAST-MODIFIED: " . gmdate("D, d M Y H:i:s", $time) . " GMT");
- header("CACHE-CONTROL: ");
- header("PRAGMA: ");
- header("EXPIRES: ");
-
- if (isset($_SERVER["HTTP_IF_MODIFIED_SINCE"])) {
-
- $if_modified_since = preg_replace("/;.*$/", "", $_SERVER["HTTP_IF_MODIFIED_SINCE"]);
-
- if(trim($_SERVER["HTTP_IF_NONE_MATCH"]) == $etag && $if_modified_since == gmdate("D, d M Y H:i:s", $time). " GMT") {
-
- header("HTTP/1.0 304 Not modified");
- header("CACHE-CONTROL: MAX-AGE={$expr}, MUST-REVALIDATE");
- exit;
-
- }
-
- }
-
- }
-
- …
-
- cmsCache_control($_SERVER[SCRIPT_FILENAME], filemtime($_SERVER[SCRIPT_FILENAME]));
- //дальше обычный вывод того, что кешируем
* This source code was highlighted with Source Code Highlighter.
Ничего особенного скрипт не делает — просто ставит в хидер дату модификации, а потом отслеживает по стандартных хидерам запроса, какая дата у закешированного файла.
Единственное дополнение — вместо filemtime() можно также использовать другую произвольную дату, в своем скрипте я использовал дату изменения самого свежего файла.
P.S. Приведенный фрагмент мною был модифицирован, чтобы учитывать сессии, но сам код взят отсюда: http://ru2.php.net/manual/ru/function.header.php#85146, а также http://foxweb.net.ru/texts/43.htm (комментарии товарища antishock).