Один ресурс - несколько кэшей
Нетрививальная задача:
а) есть два сайта на одном движке modx
б) все ресурсы в БД modx — общие для этих сайтов, т.е. одни и те же ресурсы (информация об одних и тех же ресурсах) могут отображаться на обоих сайтах
в) на каждом сайте отображается свой набор ресурсов
Т.е. на сайте A отображается информация о ресурсах 5,6,7,15,16,17, на сайте B — 5,15,16,25,28,100,101. Т.е. на каждом из сайтов должен быть доступ ко всем ресурсам.
Сейчас у меня все ресурсы лежат в одном контексте. За то, какие данные отображать на том или ином сайте — за это отвечают сниппеты и функции (определяют имя домена и отображают требуемые данные).
Проблема заключается в том, как организовать кэширование. Предположим, что один и тот же русурс загружается на сайте A и сайте B (на каждом из сайтов этот ресурс отображается по-разному и сопровождается различной информацией). Ресурс один и тот же, но кэши у него должны быть разные (отдельные). Т.е. каждый ресурс должен иметь 2 кэша для каждого из сайтов.
3 варианта организации такого «множественного» кэширования ресурсов:
1.Использование контекстов modx.
Как известно, modx создаёт свой отдельный кэш для каждого из контекстов. Можно для каждого сайта создать свой контекст, а все ресурсы «сложить» в контекст «web».
Но проблема в том, что если переключать контексты в зависимости от сайта, то из этих контекстов не будет доступа к общим ресурсам из контекста «web». А если контексты не переключать, то для разных сайтов кэш будет один и тот же.
2. Управление кэшированием через плагины.
Здесь необходимо решить 3 задачи:
а) для текущего ресурса проверить наличия кэша, соответствующего сайту
б) для текущего ресурса извлечь кэш, соответствующий сайту
в) для текущего ресурса сохранить кэш, соответствующий сайту, изменив (удлинив) имя файла кэша (формируемое по умолчанию)
Последние 2 пункта, возможно, можно решить, используя события OnBeforeSaveWebPageCache и OnLoadWebPageCache. Но в modx не предусмотрено событий, в обработчиках которых возможно повлиять на решение modx о существовании кэша ресурса для соответствующего сайта.
3. Перегрузка методов xPDOCacheManager. Но это уже дебри дремучие, с которыми придётся воевать с каждой новой версией modx.
Как решить задачу «множественного» кэширования ресурсов ?
а) есть два сайта на одном движке modx
б) все ресурсы в БД modx — общие для этих сайтов, т.е. одни и те же ресурсы (информация об одних и тех же ресурсах) могут отображаться на обоих сайтах
в) на каждом сайте отображается свой набор ресурсов
Т.е. на сайте A отображается информация о ресурсах 5,6,7,15,16,17, на сайте B — 5,15,16,25,28,100,101. Т.е. на каждом из сайтов должен быть доступ ко всем ресурсам.
Сейчас у меня все ресурсы лежат в одном контексте. За то, какие данные отображать на том или ином сайте — за это отвечают сниппеты и функции (определяют имя домена и отображают требуемые данные).
Проблема заключается в том, как организовать кэширование. Предположим, что один и тот же русурс загружается на сайте A и сайте B (на каждом из сайтов этот ресурс отображается по-разному и сопровождается различной информацией). Ресурс один и тот же, но кэши у него должны быть разные (отдельные). Т.е. каждый ресурс должен иметь 2 кэша для каждого из сайтов.
3 варианта организации такого «множественного» кэширования ресурсов:
1.Использование контекстов modx.
Как известно, modx создаёт свой отдельный кэш для каждого из контекстов. Можно для каждого сайта создать свой контекст, а все ресурсы «сложить» в контекст «web».
Но проблема в том, что если переключать контексты в зависимости от сайта, то из этих контекстов не будет доступа к общим ресурсам из контекста «web». А если контексты не переключать, то для разных сайтов кэш будет один и тот же.
2. Управление кэшированием через плагины.
Здесь необходимо решить 3 задачи:
а) для текущего ресурса проверить наличия кэша, соответствующего сайту
б) для текущего ресурса извлечь кэш, соответствующий сайту
в) для текущего ресурса сохранить кэш, соответствующий сайту, изменив (удлинив) имя файла кэша (формируемое по умолчанию)
Последние 2 пункта, возможно, можно решить, используя события OnBeforeSaveWebPageCache и OnLoadWebPageCache. Но в modx не предусмотрено событий, в обработчиках которых возможно повлиять на решение modx о существовании кэша ресурса для соответствующего сайта.
3. Перегрузка методов xPDOCacheManager. Но это уже дебри дремучие, с которыми придётся воевать с каждой новой версией modx.
Как решить задачу «множественного» кэширования ресурсов ?
Комментарии: 8
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
А войнушки касаются необходимости подстраивать свой код под изменяющуюся от версии к версии логику работы modx. Чем больше используешь тонкостей реализации modx, тем чаще придётся корректировать свой код.
К примеру, вон вышла новая версия modx 2.3 — так все компоненты, разработанные Василием, приходится корректировать. Потому что внутренняя логика работы modx несколько изменилась.
Минусы этого варианта:
1) Всю логику кэширования придётся загонять внутрь сниппетов. Т.е. практически в каждом сниппете придётся реализовывать кэширование.
2) Отходим от модели кэширования modx. Все эти сниппеты придётся вызывать некэшированными, а логику кэширования реализовывать внутри сниппетов
3) Придётся для каждого такого сниппета предусматривать и реализовывать параметр &cache для возможности отключения кэширования.
Т.е. в целом вариант некрасивый и несистемный.
Пока остановился на этом варианте как самом гибком. Для каждого сниппета — свой индивидуальный набор зависимых параметров, хэширование и прочее (всё это инкапсулировал в 2 функции, одну вызываю в начале сниппета, другую — в конце). Правда, сниппет всё равно вызывается (одно лишнее обращение к БД), но зато реализовывается тонкая индивидуальная логика кэширования.