Начальная страница

Николай Жарких (Киев)

Персональный сайт

?

Смерекеш

Смерекеш – это внутренний кэш готовых страниц «Смереки». Он кардинально (в сотни раз) ускоряет выдачу документов клиенту, поэтому следует использовать его везде, где только можно.

Управление Смерекешем

Управление Смерекешем осуществляется двумя переменными в модуле customsettings.php :

$UseSmerecashe – включает (1) или выключает (0) подсистему кэширования страниц;

$GzipSmerecashe – включает (1) или выключает (0) компрессию кэшированных страниц.

Процедура очистки Смерекеша очищает все кэшированные страницы и заставляет Смереку перегенерировать их заново. Это необходимо после смены программных модулей, которые генерируют код страниц, т.к. Смерека отслеживает изменения в данных страниц, но не изменения алгоритмов генерации.

Чтобы ее выполнить следует зайти на сайт как администратор, перейти на страницу Панель управления и щелкнуть ссылку «Очистить Смерекеш». Она будет доступна, если пользователь имеет право выполнения этой команды.

Для переключения режима компрессии необходимо действовать так: 1, выключить Смерекеш; 2, изменить значение $GzipSmerecashe; 3, обязательно очистить Смерекеш; 4, активировать Смерекеш.

Чтение из Смерекеша

Чтение из Смерекеша происходит в самом начале обработки запроса к Смереке, поэтому, если оно оказывается успешным, обработка заканчивается очень быстро, за 3 запроса к базе данных.

Для чтения необходимо одновременное исполнение следующих предпосылок:

- Смерекеш должен быть активирован;

- переменная $_GET['Path'] должна быть установлена (это всегда имеет место при символьной и виртуальной адресации);

- переменная $_GET['Node'] не должна существовать;

- переменная $_REQUEST['Cmd'] не должна существовать;

- массив $_POST должен быть пуст.

В целом, не могут кэшироваться страницы с числовой адресацией и страницы, которым передаются параметры методом POST.

Если предпосылки выполняются, происходит попытка найти кэшированную страницу. Она идентифицируется текущим URL.

Если нужной страницы нет в Смерекеше, Смерека продолжает стандартную процедуру генерации страницы.

Если страница есть в Смерекеше, выполняется проверка прав доступа пользователя. Если пользователь имеет право доступа к данной странице, она отсылается клиенту; если пользователь не имеет такого права, продолжается стандартная процедура (скажем, для генерации сообщения об ошибке).

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

Запись в Смерекеш

После окончания стандартной процедуры генерации Смерека пытается записать новую страницу в Смерекеш. Чтобы запись состоялась, необходимо выполнение всех предпосылок чтения Смерекеша + выполнение следующих условий:

- страница должна быть успешной (HTTPCode == 200), страницы с сообщениями об ошибках не кэшируется;

- шаблон страницы должен позволять кэширование (переменная PageSmerecasheable = 1); С помощью этой переменной можно разрешить / запретить кэширование всех страниц, использующих данный шаблон или шаблон, унаследованный от данного шаблона;

- страница должна соответствовать некой вершине базы данных (не кэшируются параметрические страницы);

- эта вершина должна позволять кэширование (атрибут Smerecasheable). С помощью этого атрибута можно управлять кэшированием на уровне класса вершины (задав значение этого атрибута по умолчанию) или на уровне конкретной вершины.

По умолчанию все шаблоны и классы вершин позволяют кэширование. Запрет на уровне конкретной вершины может потребоваться, например, если она содержит форму ввода, поля которой должны заполняться динамически. Запрет на уровне шаблона или класса вершины целесообразен, если соответствующие страницы имеют чисто динамическую информацию, например, корзина покупателя в веб-магазине.

Как устроен Смерекеш

Смерекеш состоит из двух таблиц: smerecash содержит собственно кэшированные страницы, smerecashlnk содержит наборы ссылок на вершины. Каждая страница в процессе генерации использует информацию из нескольких вершин, и при записи сгенерированной страницы в Смерекеш указатели на эти вершины записываются в таблицу ссылок. В дальнейшем, когда вершина меняется, все страницы кэша, в генерации которых она была задействована, сбрасываются, что заставляет Смереку генерировать их заново, отражая измененную информацию.

Когда происходит перемещение, удаление и добавление вершин, Смерека действует по очень консервативному алгоритму: сбрасываются все страницы, зависящие от всех вершин, равных перемещаемых / удаленной / добавленной. Это делается для того, чтобы агрегаторы вершин были проинформированы об изменениях в структуре базы данных и соответственно перегенерировали свой код.

Эта система автоматического сброса устаревших страниц работает только в случае, когда изменения в БД были внесены через саму Смереку; конечно, она не сработает, если изменения внесены непосредственно в БД, минуя Смереку (например, во время восстановления БД из резервной копии). Если такие изменения имели место, после них необходимо полностью очистить Смерекеш.

Отложенное обновление

Начиная с версии 1.4, Смерека поддерживает отложенное обновление Смерекеша. При этом измененные вершины только помечаются для последующего сброса устаревших страниц, но их сброс происходит не автоматически при каждом сохранении вершины, а по специальной команде.

Что это дает? Пусть на одном иерархическом уровне находится 20 вершин-статей. Мы поменяли местами два соседних статьи. При этом надо сбросить (перегенерировать) все страницы, зависящие от этих 20 вершин. Через пять минут мы поменяли местами еще две статьи. Если сброс происходит автоматически (немедленно после перемещения), то кэшированные страницы будет сброшены, и за пять минут часть из них может быть сгенерирована заново (это вполне возможно, если сайт находится под реальной нагрузкой). При следующей операции редактирования все повторится снова.

При отложенном сбросе мы можем менять эту группу вершин столько, сколько надо; при первом изменении порядка следования вершин все они будут помечены для последующего сброса, и дальнейшие операции редактирования, помечая их снова и снова, не добавляют к плану сброса ничего нового. Затем одной командой можно обновить все помеченные вершины.

Этот режим имеет особые преимущества, когда над редактированием данных работает одновременно несколько редакторов. Главный редактор при этом время от времени выполняет обновление помеченных вершин, актуализируя кэшированные страницы.

Еще одна выгода от такого режима – это возможность настроить периодическую автоматическую актуализацию Смерекеша с помощью планировщика задач (такого как cron), что дает возможность вообще забыть о необходимости обновлять Смерекеш.