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). Борьба с ним, как правило тяжела для меня, не обошлось без сложностей и в этот раз, а результатом стал следующий код

  1.  
  2. RewriteEngine on
  3. RewriteBase /
  4.  
  5. Options -Indexes
  6. Options +FollowSymlinks
  7.  
  8. ErrorDocument 404 /index.php
  9.  
  10. RewriteCond %{REQUEST_URI} ^/$
  11. RewriteRule .* out/index.html [L]
  12.  
  13. RewriteCond %{REQUEST_URI} !index\.php$
  14. RewriteCond %{REQUEST_URI} !\.html$
  15. RewriteCond %{REQUEST_URI} !\.xml$
  16. RewriteCond %{REQUEST_URI} !/tpl/
  17. RewriteRule (.*) tpl%{REQUEST_URI} [L]
  18.  
  19. RewriteCond %{REQUEST_URI} \.(html|xml)$
  20. RewriteCond %{REQUEST_URI} !out/[^/]+$
  21. RewriteRule (.*) out%{REQUEST_URI} [L]
  22.  

UP 2010.01.14 В приведенном коде допущена небольшая ошибка, связанная с индексацией блога роботами поисковых систем, обновленную версию можно найти в статье Funky Cache. Работа над ошибками, а обсуждение ошибки в комментариях ниже.

Теперь в корне сайта лишь index.php и .htaccess, а весь контент переехал в папку out. Кроме того я отделил от контента различные js-скрипы, css стили и избражения, разместив их в папке tpl. Все что нужно сделать после обновления контента - это почистить папку out, которая постепенно будет заполняться просмотренными страницами сайта. Пока мне приходится чистить папку руками, но я думаю, что очень скоро поставлю себе на службу пару скриптов и тогда добавление новой статьи в блог сведется к копированию текстового файла по FTP.

Читайте в блоге

TinyURL. Шаг 5. Последние штрихи и запуск
TinyURL. Шаг 4. Обработка кнопки на примере формы входа
TinyURL. Шаг 3. Рендеринг интерфейса
JavaScript Преобразование массивов и объектов в строку
Рисуем график на PHP

Комментарии:

Владимир Рыбаков @ 11.11.2009 23:50

Переход вряд ли можно считать безболезненным, но я постараюсь все бысро восстановить и улучшить. Да и код пока, слишком грязный получился - надо делать уборку.
satrtas @ 14.01.2010 00:48

А если запрашиваемой страницы не существует она тоже попадет в кеш? А поисковики, если они зайдут на страницу, которой еще нет в кеше, они получат 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

Владимир Рыбаков @ 14.01.2010 02:05

Нет, несуществующая страница в кэш не попадает. В этом случае index.php выдаст соответствующее сообщение. Можете посмотреть, как это выглядит http://it.nittis.ru/nopage.html

С поисковиками должно быть все нормально, по крайней мене в индексе страницы присутствуют. (хотя сейчас посмотрел в панели яндекса и обнаружил полтора десятка страниц исключенных яндексом)

А за исходиник, благодарю. Я ухватился за описание идеи и сразу бросился ее реализовывать в меру своего понимания, даже не взглянув на предложенный автором код. Непременно подвергну его пристальному изучению.

А вообще идея оказалась годной. Надо только с поисковиками разобраться и выяснить почему для некоторых страниц сервер вернул 404.
sartas @ 14.01.2010 12:58

Допустим что страниц в кеше еще нет.

Поисковик заходит на сайт, в .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>
Владимир Рыбаков @ 14.01.2010 13:29

Хотел написать, что заголовок не передается поисковику, но получасовое исследование логов и данных из панели вебмастера, говорит, что это не так. Яндекс действительно получает заголовок с 404 ошибкой, в том случае, если их нет в кеше.

Спасибо за помощь, сейчас поправлю .htaccess, чтобы не возникало проблем с индексацией в будущем.

Войдите на сайт, чтобы оставить комментарий