Выдаем вместо кэша html файлик
Предыстория. Возник такой вопрос. Есть какой то сайт, и в нем получается в каталоге было так. В вызов mFilter2 вложено в чанк еще парочка вызовов msProducts ну и так далее. В итоге, раздел грузился за овер 10 секунд. Да, сейчас напишите, что вот надо оптимизировать. Это понятно, но я решил подойти с другой стороны.
Итак, идея была такая, что бы вместо кэша выдавать уже готовую разметку целой страницы.
В итоге, у нас есть плагин:
Вопрос знатокам, на сколько такой подход вообще жизнеспособный по отношению к системе? Очень бы хотелось услышать комментарии.
Спасибо за донаты:
@Павел Бигель
Итак, идея была такая, что бы вместо кэша выдавать уже готовую разметку целой страницы.
В итоге, у нас есть плагин:
<?php
switch($modx->event->name){
case 'OnWebPagePrerender':
// Тут просто условие, чтобы срабатывал только на категории (можно по сути задавать разные условия)
if($modx->resource->class_key != 'msCategory'){
return;
}
//Забираю отрендеренный ресурс
$_output = &$modx->resource->_output; //Забираю отрендеренный ресурс
// Создаю файлик разметки этого ресурса (можно по сути указать любой путь и так далее, сейчас и так сойдет)
$file = MODX_BASE_PATH . 'resourcecache/' . $modx->resource->uri . '/' . $modx->resource->id . '.txt';
if(is_file($file)){
// Если такой файлик уже существует, то просто отдаю его содержимое
$output = file_get_contents($file);
}else{
// Если файлика нету, то записываю туда отрендеренную страницу
$cache = $modx->getCacheManager();
$cache->writeFile($file, $_output);
$output = $_output;
}
// Подменяю вывод на готовый
$modx->resource->_output = $output;
break;
case 'OnLoadWebPageCache':
// Это событие срабатывает до рендера страницы, оно проверяет, есть ли кэш страницы, и если он есть...
$file = MODX_BASE_PATH . 'resourcecache/' . $modx->event->params['resource']->uri . '/' . $modx->event->params['resource']->id . '.txt';
//...мы проверяем файлик, так как страница уже грузилась и файлик есть и подменяем кэш на содержимое неашего файлика.
if(is_file){
$modx->event->params['resource']->_content = file_get_contents($file);
}
break;
}
Итог, раздел грузился за 10 секунд (ну да, такой раздел, идея в другом), после плагина уже за 0.006 секунды, так как выдается готовая разметка.Вопрос знатокам, на сколько такой подход вообще жизнеспособный по отношению к системе? Очень бы хотелось услышать комментарии.
Спасибо за донаты:
@Павел Бигель
Поблагодарить автора
Отправить деньги
Комментарии: 10
А если в фильтре выбрать какой-то параметр, потом скопировать адрес страницы (mFilter2 же меняет адрес на лету) и нажать F5? Плагин не учитывает GET-параметры, получается функционал дружественных урлов фильтра перестаёт работать.
да, в данный момент верно. Можно подумать с этим, но если на пример просто какие то каталоги, то мне кажется использовать вполне можно
А, еще если на странице есть части, которые для разных пользователей разные (например, авторизованный и неавторизованный пользователь) — такое решение тоже будет не совсем корректно. Но для простых каталогов да, очень полезная вещь.
А если проверять в плагине пользователя и в зависимости от того, какой юзер запросил страницу, выдавать нужную разметку?
Ну да, просто добавить в ключ кеша ID пользователя и md5-хеш GET-параметров. Типа такого, наверное:
$file = MODX_BASE_PATH . 'resourcecache/' .
$modx->resource->uri . '/' .
$modx->resource->id . '/' .
md5($modx->toJSON($_GET)) . '/' .
'user_' . $modx->user->id . '.txt';
Не, ребят! Ну ведь же чудесная у нас CMF!
И расширение классов есть, и можно выдавать файл с диска вместо кэша!
Ну круто.
И расширение классов есть, и можно выдавать файл с диска вместо кэша!
Ну круто.
Действительно))) Больше же нигде такого нет)))
Я что-то сказал про уникальность и неповторимость MODX?
Радует, что в MODX можно делать также, как и в продвинутых фреймворках.
Радует, что в MODX можно делать также, как и в продвинутых фреймворках.
Плагин statcache – решение 2014 2013 года. Только он даже php не дёргает для отдачи статики, если есть файл html в нужном каталоге. (локэйшн в nginx с этим прекрасно справляется, и, кстати, для олдфагов есть даже конфиг для apache)
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.