Funky Cache
На днях искал плагин к jQuery, котороый позволяет редактировать текст прямо в теле страницы. Нашлось немало разных скриптов, но пока свой выбор я остановил на jEditable.
Но сегодня я хочу поговорить не об этом плагине, а о другой интересной статье обнаруженной на сайте разработчика Ultrafast Frog With Funky Cache, которая рассказывает о весьма любопытном методе кеширования данных на web-сайте.
Итак, представляю вам Funky Cache, суть которого заключается всего в паре предложений. Ошибка 404 перенаправляется на основной скрипт сайта, где принимаетя решение о ее существовании и, при необходимости, производится генерация статической страницы. Страница генерируется в тот момент, когда пользователь ее запрашивает и только в тм случае если ее уже нет на сайте. Управление кешем сводится к простому удалению устаревших, или изменившихся файлов. Mika приводит удивительные результаты тестирования, которые демонстрируют преимущества Funky Cache.
Идея настолько мне понравилась, что я тут же сел и переписал движок этого блога в соответствии с предложенной идеологией. Теперь все страницы сайта, которые вы видите меняются лишь при изменении контента на сайте - в остальное время вы видите только статику, ни одной php вставки.
Больше всего меня празило то, что в русскоязычном итернете я не нашел ни одного упоминания о Funky Cache и это с учетом того, что впервые идея была озвучена на PHPCon 2002
Для реализации Funky Cache естественно понадобится mod_rewrite (ссылка в тему .htaccess). Борьба с ним, как правило тяжела для меня, не обошлось без сложностей и в этот раз, а результатом стал следующий код
RewriteEngine on RewriteBase / Options -Indexes Options +FollowSymlinks ErrorDocument 404 /index.php RewriteCond %{REQUEST_URI} ^/$ RewriteRule .* out/index.html [L] RewriteCond %{REQUEST_URI} !index\.php$ RewriteCond %{REQUEST_URI} !\.html$ RewriteCond %{REQUEST_URI} !\.xml$ RewriteCond %{REQUEST_URI} !/tpl/ RewriteRule (.*) tpl%{REQUEST_URI} [L] RewriteCond %{REQUEST_URI} \.(html|xml)$ RewriteCond %{REQUEST_URI} !out/[^/]+$ RewriteRule (.*) out%{REQUEST_URI} [L]
UP 2010.01.14 В приведенном коде допущена небольшая ошибка, связанная с индексацией блога роботами поисковых систем, обновленную версию можно найти в статье Funky Cache. Работа над ошибками, а обсуждение ошибки в комментариях ниже.
Теперь в корне сайта лишь index.php и .htaccess, а весь контент переехал в папку out. Кроме того я отделил от контента различные js-скрипы, css стили и избражения, разместив их в папке tpl. Все что нужно сделать после обновления контента - это почистить папку out, которая постепенно будет заполняться просмотренными страницами сайта. Пока мне приходится чистить папку руками, но я думаю, что очень скоро поставлю себе на службу пару скриптов и тогда добавление новой статьи в блог сведется к копированию текстового файла по FTP.
TinyURL. Шаг 5. Последние штрихи и запуск
TinyURL. Шаг 4. Обработка кнопки на примере формы входа
TinyURL. Шаг 3. Рендеринг интерфейса
JavaScript Преобразование массивов и объектов в строку
Рисуем график на PHP
Комментарии:
Переход вряд ли можно считать безболезненным, но я постараюсь все бысро восстановить и улучшить. Да и код пока, слишком грязный получился - надо делать уборку.
А если запрашиваемой страницы не существует она тоже попадет в кеш? А поисковики, если они зайдут на страницу, которой еще нет в кеше, они получат 404 ошибку, или нет?
На том же сайте разработчика есть плагин Fanky Cache для Frog CMS, .htaccess:
Options +FollowSymLinks
AddDefaultCharset UTF-8
DirectoryIndex index.html index.php
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
# Administration URL rewriting.
RewriteRule ^admin(.*)$ admin/index.php?$1 [L,QSA]
# Rewrite index to check for static.
RewriteCond %{DOCUMENT_ROOT}/cache/index.html -f
RewriteRule ^$ /cache/index.html [L,QSA]
# Rewrite to check for cached page from cached folder.
RewriteCond %{REQUEST_METHOD} ^GET$
RewriteCond %{DOCUMENT_ROOT}/cache/%{REQUEST_URI} -f
RewriteRule ^(.*)$ /cache/$1 [L,QSA]
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-f
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-d
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-l
# Main URL rewriting.
RewriteRule ^(.*)$ index.php?PAGE=$1 [L,QSA]
</IfModule>
И никаких ErrorDocument 404 /index.php
Нет, несуществующая страница в кэш не попадает. В этом случае index.php выдаст соответствующее сообщение. Можете посмотреть, как это выглядит http://it.nittis.ru/nopage.html
С поисковиками должно быть все нормально, по крайней мене в индексе страницы присутствуют. (хотя сейчас посмотрел в панели яндекса и обнаружил полтора десятка страниц исключенных яндексом)
А за исходиник, благодарю. Я ухватился за описание идеи и сразу бросился ее реализовывать в меру своего понимания, даже не взглянув на предложенный автором код. Непременно подвергну его пристальному изучению.
А вообще идея оказалась годной. Надо только с поисковиками разобраться и выяснить почему для некоторых страниц сервер вернул 404.
Допустим что страниц в кеше еще нет.
Поисковик заходит на сайт, в .htaccess идет проверка на наличие страницы в кеше, ее там нет -> ошибка 404, запрос передается в index.php, который генерирует нужную страницу. А поисковику-то уже без разницы, что находится на странице, в ее заголовке уже прописана 404 ошибка, значит эта страница не существует.
Заодно приведу стандартный .htaccess от Frog cms:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
# Administration URL rewriting.
RewriteRule ^admin(.*)$ admin/index.php?$1 [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
# Main URL rewriting.
RewriteRule ^(.*)$ index.php?PAGE=$1 [L,QSA]
</IfModule>
Хотел написать, что заголовок не передается поисковику, но получасовое исследование логов и данных из панели вебмастера, говорит, что это не так. Яндекс действительно получает заголовок с 404 ошибкой, в том случае, если их нет в кеше.
Спасибо за помощь, сейчас поправлю .htaccess, чтобы не возникало проблем с индексацией в будущем.
Войдите на сайт, чтобы оставить комментарий