Кеширование
Система кеширования необходима любому высоконагруженному интернет-магазину. Обычно владельцы магазинов хотят реализовать как можно больше функций, чтобы привлечь покупателей, а вот расплачиваться за это приходится программистам. И они вынуждены балансировать между большим количеством реализуемых функций, приемлемой скоростью формирования страницы и наглядностью исходного кода. Именно для оптимизации этого баланса нами была предусмотрена и разработана система автоматического кеширования. С ее помощью при разработке модулей Вы сможете ставить на первое место наглядность и простоту исходного кода. А за счет использования кеша формирование страниц будет происходить быстро и эффективно.
Тут также следует иметь в виду особенность архитектуры Melbis Shop 6, а именно то, что редактирование описаний товаров и их набивка осуществляется в персональном разделе и в пакетном режиме. Это достаточно важно для любой системы кеширования, так как именно этот фактор способствует менее частому обновлению кеша (данные меняются реже).
Поскольку с модульными скриптами оперирует парсер, то именно в нем расположена система автоматического кеширования. Когда Вы запускаете парсер методом Parse($gSitePath, $gTemplate, ... , $gUseCache, $gBuild), то через параметр $mUseCache происходит включение или выключение системы кеширования. Кроме этого, есть возможность отключить функцию кеширования для конкретного модуля (например, во время его отладки). Для этого необходимо отключить опцию "Кеширование" в соответствующем модуле (подробнее см. Модульные скрипты).
Каким же образом работает система кеширования? Что именно кешируется и что является сигналом для необходимости обновления кеша? Давайте рассмотрим ключевые моменты:
- Кешируется результат работы модуля.
После того, как модуль был выполнен, HTML-код, который он сформировал, записывается на диск в директорию /system/cache/имя_шаблона/unit.имя_модуля/время_формирования_кеша/. И при последующем вызове этого модуля система вместо его исполнения использует сформированный ранее и уже готовый HTML-код. Тут мы хотим дать Вам важную рекомендацию: если Ваш сервер не имеет SSD-диск, то рекомендуется все же его приобрести или хотя бы переместить папку /system/cache на SSD-диск (простой установкой ссылки). Это даст весьма существенный прирост скорости. - Кеширование можно отменить внутри самого модуля.
Бывает случаи, когда необходимо повторно вызвать модуль и причем несмотря на то, что зависимые таблицы не претерпевали изменений. Например, Вы пытались сохранить данные в модуле, но безуспешно, и необходимо повторить эту процедуру вновь при следующем вызове. Для этого необходимо использовать метод отмены кеша прямо внутри модуля с помощью $gParser->ResetModuleCache(); - Кеш модуля зависит от входных параметров модуля.
Поскольку у модуля могут быть различные входные параметры, то, соответственно, модуль будет возвращать разный HTML-код в каждом случае. Чтобы различить результаты работы модуля, имя кеш-файла кодируется в зависимости от входных параметров. В связи с этим есть пара важных моментов, которые Вам следует учесть при разработке модулей: - Внутри модуля нельзя напрямую обращаться к входным глобальным массивам, например к $_GET, $_POST, $gParser->gVars и т.п. То есть, при включенной системе кеширования обращение к ним из модуля сформирует на выходе HTML-код, который будет различаться в зависимости от их содержимого. Таким образом, Вы столкнетесь с тем, что модуль перестанет работать (будет возвращать один и тот же результат). Соответственно, чтобы избежать этого, Вам необходимо передавать входные данные как параметры модуля, например: {MELBIS:melbis_goods_item:[GOODS:ID],middle}. Тогда кеш будет формироваться правильно, то есть отдельный файл для каждого набора входных параметров.
- Внутри модуля нельзя использовать PHP-функции типа require или include для подключения библиотек, которые работают с базой данных. Для этого нужно использовать специальную форму выбора библиотек-модулей, которая находится в среде разработки справа от кода скрипта. Только так , благодаря правильному подключению библиотек, система кеширования будет учитывать изменения не только в тех таблицах, которые используются в модуле, но и в тех, которые есть в подключенных модулях.
- Время устаревания кеша определяется по изменению таблиц базы данных.
Фактически результат работы модуля зависит от двух факторов: от входных параметров и от получаемых данных из базы. Таким образом, логично обновлять кеш в том случае, когда произошло изменение данных в таблицах. Конечно, каждый модуль зависит не от всех таблиц, которые есть в базе данных, а лишь от тех, которые используются в модуле. Чтобы облегчить работу разработчикам модулей, мы сделали так, что парсер автоматически определяет те таблицы, которые используются в модуле. Единственное, что потребуется от Вас, - это указать имена таблиц, используя ключ {DBNICK}. Например: SELECT * FROM {DBNICK}_topic. Кроме этого, у Вас есть дополнительный инструмент управления временем жизни кеша - это опция "Таймаут", которую можно задать для каждого модуля (время задается в минутах). С ее помощью Вы можете дополнительно уменьшить нагрузку на сервер, указав, что кеш необходимо перестраивать не сразу после изменения данных в таблицах, а спустя определенное время.Важно! Часто при разработке модулей требуется создавать временные таблицы (TEMPORARY TABLE). В этом случае Вам необходимо исключить эти таблицы из списка кешируемых таблиц (отображается для каждого модуля в правой части редактора среды разработки). - Частое обновление таблиц магазина делает кеширование бесполезным.
Как мы уже сказали выше, сигналом к обновлению кеша служит изменение соответствующих таблиц. Что это значит? Плохо это или хорошо? Благодаря тому, что комплекс Melbis Shop 6 работает в пакетном режиме данных, то есть, в отличии от веб-интерфейса модификация таблиц происходит одним махом: вносятся сразу много изменений в таблицу, а не "в час по чайной ложке". Это безусловный плюс архитектуры комплекса очень выгоден для системы кеширования. Ведь в этом случае обновлять кеш системе придется гораздо реже! Однако, не все зависит и от системы, нужна еще правильно организовать работу. Ведь если скажем набивать описания товаров и жать каждые пять минут на кнопку "Сохранить", то кеш соответствующих модулей тоже будет перестраиваться каждые пять минут (при условии, что не задан таймаут кеша). Поэтому обратите внимание на раздел "Пользователи" где для каждой операции можно задать время, когда она может быть выполнена! Ограничьте выполнение определенных операций в час пик работы магазина. - Нет смысла кешировать абсолютно все модули.
Как уже говорилось выше, Вы можете индивидуально для каждого модуля включать и выключать режим кеширования. Обратите внимание, что есть модули которые выполняются достаточно часто, а входные параметры у них каждый раз разные. В этом случае нет смысла кешировать результат работы модуля, так как поиск сохраненного кеш-файла на диске будет сопоставим со временем его работы. - Нельзя использовать PHP-функцию header внутри модуля.
Не следует использовать PHP-функцию header() внутри модуля результат работы которого кешируется. Дело в том, что это PHP-функция выводит результат сразу в поток и его закешировать нельзя. Поэтому, правильнее всего будет печатать заголовок страницы или AJAX-ответа в скрипте-странице.