Сделано в Раскрутке

Архив эхоконференции RU.PHP

- 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% на первый месяц обслуживания!
Самый простой способ получить ROOT-доступ
При переходе по баннеру - скидка 25% на первый месяц обслуживания!