Смерекеш
Смерекеш – це внутрішній кеш готових сторінок «Смереки». Він кардинально (в сотні разів) прискорює видачу документів клієнту, тому варто використовувати його скрізь, де тільки можна.
Управління Смерекешем
Управління Смерекешем здійснюється двома змінними в модулі 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), що дає можливість взагалі забути про необхідність оновлювати Смерекеш.