Как программно обновить кэш определённого ресурса
Имеется ресурс с id = 950000
Как с помощью modx'ового cacheManager'а обновить (создать) кэш этого ресурса?
Как с помощью modx'ового cacheManager'а обновить (создать) кэш этого ресурса?
$cacheManager = $modx->getCacheManager();
а дальше ?
Комментарии: 9
$resourceId = 950000
$resource = $modx->getObject('modResource', $resourceId);
$cacheKey = $resource->getCacheKey(); // возвращает mgr/resources/950000
$cacheManager = $modx->getCacheManager();
$cacheManager->refresh(array('resource' => array('key' => $cacheKey)));
Физически кэш ресурса не создаётся. Проверил непосредственно в папке core/cache/resource — пустоПробовал и так:
$resourceId = 950000
$cacheKey = "web/resources/950000";
$cacheManager = $modx->getCacheManager();
$cacheManager->refresh(array('resource' => array('key' => $cacheKey)));
Тоже кэш ресурса не создаёт. Проверил непосредственно в папке core/cache/resource — пустоМожет, refresh пересоздаёт кэш только если он уже существует?
Мне необходимо создать кэш ресурса. Если кэш существует, то обновить.
Все эти действия выполняются в контексте `mgr`.
Это удаляет кэш ресурса.
Создан он будет при первом же обращении. Самый простой способ — запросить страничку через wget.
Создан он будет при первом же обращении. Самый простой способ — запросить страничку через wget.
тогда в случае с одним ресурсом наверно проще
Я вообще по наивности глядя на название тоже думал что он обновляет…
$cacheManager->delete($cacheKey)
?Я вообще по наивности глядя на название тоже думал что он обновляет…
Может изначально так и должно было быть, но в итоге — вот так.
MODX не совершенен :-(
MODX не совершенен :-(
В логах пусто. И в логах modx (включены все сообщения от warnings и серьёзнее), и в логах php.
Пока вижу 3 варианта обновления кэша ресурса:
1. Через file_get_contents:
2. Генерация кэша ресурса через modxCacheManager->generateResource()
3. Использование внешней утилиты wget
1-й способ — самый затратный по времени, т.к. придётся ждать полной загрузки страницы:
— выполняться будут не только кэшируемые элементы, но и некэшируемые (а для получения кэша ресурса некэшируемые элементы выполнять вовсе не нужно — это лишняя трата времени)
— придётся ждать полной загрузки данных со сторонних ресурсов (а сторонние ресурсы могут отдавать данные криво и долго)
2-й способ работает быстрее, т.к. выполняются только кэшируемые элементы.
3-й способ (wget), интересен тем, что можно запустить процесс загрузки страницы ресурса (как в 1-м способе), но при это не ждать завершения загрузки. Т.е. можно будет всего лишь инициировать процесс загрузки (обновления кэша) в отдельном потоке и продолжить выполнение своего кода.
Всё верно?
1. Через file_get_contents:
$resourceId = 950000;
$resource = $modx->getObject('modResource', $resourceId);
$context = $resource->get('context_key');
$url = $modx->makeUrl($resourceId, $context, '', 'full');
$content = file_get_contents($url); // загрузка страницы ресурса с генерацией его кэша
2. Генерация кэша ресурса через modxCacheManager->generateResource()
3. Использование внешней утилиты wget
1-й способ — самый затратный по времени, т.к. придётся ждать полной загрузки страницы:
— выполняться будут не только кэшируемые элементы, но и некэшируемые (а для получения кэша ресурса некэшируемые элементы выполнять вовсе не нужно — это лишняя трата времени)
— придётся ждать полной загрузки данных со сторонних ресурсов (а сторонние ресурсы могут отдавать данные криво и долго)
2-й способ работает быстрее, т.к. выполняются только кэшируемые элементы.
3-й способ (wget), интересен тем, что можно запустить процесс загрузки страницы ресурса (как в 1-м способе), но при это не ждать завершения загрузки. Т.е. можно будет всего лишь инициировать процесс загрузки (обновления кэша) в отдельном потоке и продолжить выполнение своего кода.
Всё верно?
Всё-таки самым надёжным и приемлемым в плане скорости является modxCacheManager->generateResource().
file_get_contents будет выполняться долго, пока не загрузятся все данные страницы. Более того, php-опция allow_url_fopen может быть отключена, тогда функция с url работать не будет.
А wget — внешняя утилита, которой может не быть в дистрибутиве. И если её запускать в отдельном потоке (асинхронно), то мы не сможем проконтролировать успешность обновления кэша. Если её запускать синхронно, то имеют место все недостатки file_get_contents'а.
file_get_contents будет выполняться долго, пока не загрузятся все данные страницы. Более того, php-опция allow_url_fopen может быть отключена, тогда функция с url работать не будет.
А wget — внешняя утилита, которой может не быть в дистрибутиве. И если её запускать в отдельном потоке (асинхронно), то мы не сможем проконтролировать успешность обновления кэша. Если её запускать синхронно, то имеют место все недостатки file_get_contents'а.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.