- RU.PHP ------------------------------------------------------------- RU.PHP -
Msg : #9057 [872]
От : Mithgol the Webmaster 2:6023/802.24 20 июня 04, 17:36
Кому : All 23 июня 04, 23:35
Тема : Слово о методе, позволяющем PHP-странице закэшироваться
-------------------------------------------------------------------------------
Во времена далёкие и незапамятные, сиречь аж 21 апреля нынешнего года, Аскольд
Волков дал мне (в этой эхе) добрый совет о кешировании PHP-страниц в браузере.
Совет звучал следующим образом:
======= Hачало цитаты из файла Windows Clipboard =======
MtW> Я тут помедитировал над этим вопросом почти неделю и понял, что его
MtW> возможно обобщить. Каким вообще образом можно заставить результат
MtW> работы PHP-скрипта, насколько это возможно, остаться в кэше браузера?
Этот вопрос я подробно исследовал и кое-каких результатов добился. Итак чего
я получил.
1. Last-modified или ETag. Разные версии даже одного браузера ведут себя
по-разному. Last-modified вроде понимают все, а ETag нет, при наличии обоих
некоторые отдают предпочтение If-Modified-Since, а некоторые If-None-Match.
В общем, с Last-modified как-то более прозрачно получается.
2. От чего зависит попадет ли страница в кэш броузера - это великая тайна,
ведомая разве что броузерописателям. Hо наличие заголовка "Expires:", причем
с разумным временем, а не в следующем тысячелетии, способствует.
3. Expires влияет также не только на попадание в кэш, но и на то будет ли
броузер посылать If-Modified-Since или просто тихо возьмет страницу из кэша.
Впрочем, настройки броузера на это тоже влияют.
4. session_cache_limiter('private, must-revalidate, no-store, max-age=5'); -
не возьмусь утверждать, что это оптимальные параметры, тем более, что я их
не особо понимаю, но помогает.
MtW> Hе секрет, что PHP-скрипт нередко используется в качестве удобной
MtW> замены SSI. Однако ж для SSI придумана (на серверах Apache) директива
MtW> XBitHack full, позволяющая без дальнейшей возни снабдить HTTP-отклик
MtW> вебсервера полем Last-modified (во всяком случае, в Unix). А каким
MtW> образом решить эту задачу для PHP?
header(Last-Modified: '.gmdate('D, d M Y H:i:s',filemtime($file)).' GMT');
MtW> А что нужно сделать, чтобы такая страница не вывалилась из кэша раньше
MtW> времени? Станет ли Apache правильно реагировать на GET-запрос с полем
MtW> If-Modified-Since?
Похоже, зависит от настроек Apache, точнее установленных расширений. Hо
можно среагировать и внутри скрипта.
MtW> Будет ли браузер посылать серверу в запросе поле If-None-Match, если
MtW> изначально для PHP-вывода не отдавался ETag?
нет
MtW> Как добиться именно
MtW> HTTP/1.x 304 Not Modified в заголовке HTTP-отклика вебсервера?
я делаю так:
header('Expires: '.gmdate('D, d M Y H:i:s',time()+2592000).' GMT', TRUE,
304);
при чем тут Expires? А просто я не нашел в PHP возможности изменить код
ответа, кроме как с помощью функции header.
======= Конец цитаты из файла Windows Clipboard =======
Сегодня, немного почесав себе репу, я наковырял в manuaле способ изменить код
HTTP-отклика вебсервера, не извращая заголовок Expires (и, собственно говоря,
вообще не трогая заголовок Expires).
В результате у меня получился нижеследующего вида файлик:
======= Hачало цитаты из файла cache-it.mtw =======
======= Конец цитаты из файла cache-it.mtw =======
Покамест у меня выходит, что если в начале некоего PHP-файла засунуть оператор
include($_SERVER["DOCUMENT_ROOT"] . "/путь/от/корня/cache-it.mtw");
то этот PHP-файл (а точнее говоря -- результат его работы) гарантированно
засунется в кэш браузера примерно таким же манером, как туда засовывается
обычная HTML-вебстраница. Без expires-заголовка, потому что и обычные страницы
его не имеют ведь!
При проверке я использовал сервер Apache/2.0.47 (Win32) PHP/4.3.4 и клиентский
браузер Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7) Gecko/20040614
Firefox/0.8 -- и в связи с этим вопрос: быть может, кто-то обладает сведениями,
способными скорректировать мой энтузиазм? Быть может, вышеприведённые 4 строки
либо недостаточны для достижения желаемого эффекта, либо обладают нежелательным
побочным действием? -- я ведь не могу проверить действие этого скрипта на всех
популярных платформах.
Прошу высказываться.
Ceterum censeo Diptaunum esse delendam! http://mithgol.pp.ru/
Mithgol the Webmaster. [Team В эхолисте ,,ё`` уместим] [Team А я меняю subj]
... должны были видеть наше могущество, несокрушимую силу органов. (Абакумов)
--- Эшелону: rs9512c Jiang Zemin Южная Африка Сергеев Montenegro Toeffler
* Origin: Hикогда Фидо не бpошу -- потому что босс хоpоший!!! (2:6023/802.24)
При переходе по баннеру - скидка 25% на первый месяц обслуживания! При переходе по баннеру - скидка 25% на первый месяц обслуживания!