- RU.PHP ------------------------------------------------------------- RU.PHP -
Msg : #9061 [872]
От : Mithgol the Webmaster 2:6023/802.24 21 июня 04, 09:07
Кому : Askold Volkov 23 июня 04, 23:35
Тема : Слово о методе, позволяющем PHP-странице закэшироваться
-------------------------------------------------------------------------------
Так было 07:07 21 Jun 04 написано от Askold Volkov к Mithgol the Webmaster:
MtW>> Сегодня, немного почесав себе репу, я наковырял в manuaле способ
MtW>> изменить код HTTP-отклика вебсервера, не извращая заголовок Expires
MtW>> (и, собственно говоря, вообще не трогая заголовок Expires).
MtW>> header("HTTP/1.x 304 Not Modified");
AV> Этот способ, конечно, работает. Hо в моем случае в ответе стояла именно та
AV> версия протокола, которая реально используется при связи, а не непонятная
AV> HTTP/1.x. Может это и все равно, но... кто его знает.
О да! Спасибо за верное и дельное замечание. Конечно, это моя недоработка --
следовало бы писать header($_SERVER["SERVER_PROTOCOL"] . " 304 Not Modified");
так я и поступлю теперь.
MtW>> include($_SERVER["DOCUMENT_ROOT"] . "/путь/от/корня/cache-it.mtw");
MtW>> то этот PHP-файл (а точнее говоря -- результат его работы)
MtW>> гарантированно засунется в кэш браузера примерно таким же манером, как
MtW>> туда засовывается обычная HTML-вебстраница. Без expires-заголовка,
MtW>> потому что и обычные страницы его не имеют ведь!
AV> Дык вот именно, что "таким же манером, как туда засовывается обычная
AV> HTML-вебстраница". А она тоже засовывается туда отнюдь не гарантированно.
AV> Т.е. в твоей любимой мазиле может и гарантированно, но 90% населения
AV> пользуется отнюдь не мазилой. А в IE поведение кэша весьма непредсказуемо
AV> и загадочно. И экспериментальный факт состоит в том, что наличие expires
AV> повышает вероятность попадания в кэш.
Каким образом я могу повторить твой эксперимент? С файерфоксом всё было ясно:
модуль Live HTTP Headers прекрасно справлялся с задачкой демонстрации заголовка
HTTP-запроса и HTTP-отклика. А с MSIE как быть?
AV> Да и в любом случае даже при попадании в кэш есть еще альтернатива -
AV> запрашивать if-modified-since или тихонько взять из кэша ничего не
AV> запрашивая, а это уж точно управляется expires.
Правильно. Hо штука в том, что прямо сейчас лично я рассматриваю тот случай,
когда программы PHP используются как более быстрый способ написания обычной
вебстраницы, то есть для определения крупных блоков разметки с автоматической
подстановкою изменяющихся частей из аргументов функции. А в этом случае, как и
для обычной страницы, сложно определить, when it _expires_. Может, я её щазз
через пять минут поменяю. А может, она там месяц пролежит. Мне нужен именно
механизм корректного отклика на if-modified-since; а вот если его недостаточно,
тогда буду думать.
Я сейчас поставил эксперимент над Mozilla/4.0 (compatible; MSIE 6.0; Windows NT
5.1) и получил любопытный результат: после применения cache-it.mtw моя страница
застряла в кэше настолько надёжно, что если в файл cache-it.mtw что-то вписать
(не трогая дату модификации основного скрипта), то по обычному Reload будет
показываться прежняя версия, а по Shift+Reload -- версия со вписанным кодом.
Парадокс в том, что и _после_ Shift+Reload, если нажать простой Reload, то
вписанный код убирается со страницы -- то есть прежняя версия _всё_ _ещё_
находится в кэше у MSIE! Версия MSIE 6 с установленным SP 1, плюс пять штук
обновлений (Q813489, Q328389, Q330994, Q828750, Q832894).
То есть всё работает как ожидалось -- даже, гм, едва ли не слишком хорошо.
А какие экспериментальные факты свидетельствуют обратное?
Ceterum censeo Diptaunum esse delendam! http://mithgol.pp.ru/
Mithgol the Webmaster. [Team В эхолисте ,,ё`` уместим] [Team А я меняю subj]
... Иванушка! Hе пей из следов кобольдова копытца - хаотиком станешь!.. [ADoM]
--- Знаешь ли ты, Askold, что "наделённый" пишется через "ё"?
* Origin: Заменяем чипы RAM на ROM заземлённым острым топором (2:6023/802.24)
При переходе по баннеру - скидка 25% на первый месяц обслуживания! При переходе по баннеру - скидка 25% на первый месяц обслуживания!