В 14-ой версии в плагин WP-Recall был введен свой функционал кеширования.
Данный функционал включается в настройках плагина, после чего вкладки личного кабинета, поддерживающие данный функционал начинают сохранять свой контент в файл кеша, автоматически обновляя его через указанный в настройках временной интервал.
Следует знать, что данное кеширование является объектным, т.е. кешируется не вся страница, а только указанный участок кода. Для каждого объекта кеширования создается свой кеш-файл.
Использование по-умолчанию
Разработчикам дополнений к плагину для поддержки функционала кеширования при формировании вкладки личного кабинета через функцию rcl_tab() следует указывать дополнительную опцию 'cache' в значении true, например:
add_action('init','rcl_add_followers_tab'); function rcl_add_followers_tab(){ rcl_tab('followers','rcl_followers_tab',__('Followers','wp-recall'),array('cache'=>true)); }
Для кеширования вывода контента, формируемого через сторонние шорткоды от других плагинов или самого шаблона становится возможным использовать отдельный шорткод кеширования [ rcl-cache ], в котором через необязательные атрибуты можно указывать:
- time - время кеширования
- key - уникальный ключ кеширования
- only_guest - кеширование только для неавторизованных посетителей сайта
Например:
//тут размещаем кешируемый контент, //формируемый через другие шорткоды
Следует знать, что использование шорткода кеширования бессмысленно в php-коде, так как, в этом случае, php-код размещенный внутри шорткода все равно будет отрабатывать.
Также следует учитывать, что контент формируемый шорткодом userlist автоматически кешируется при включении функционала кеширования от плагина и его дополнительное кеширование не требуется.
Кастомное кеширование
Рассмотрим порядок использования функционала кеширования плагина внутри php-кода.
Общий принцип:
- Перед кешируемым кодом проверяем наличие кеша и его актуальность
- Если кеш актуален и не требует обновления, то возвращаем его до работы кешируемого кода
- Если кеш-файл отсутствует или устарел, то отрабатывает кешируемый код и возвращает результат работы в переменную
- Отдаем результат работы кешируемого кода, сформированную переменную в кеш, создаем или обновляем файл кеширования
- Возвращаем результат работы кешируемого кода
Приступим к практическому применению:
//определяем объект кеширования $rcl_cache = new Rcl_Cache(); //проверяем следует ли использовать кеширование if($rcl_cache->is_cache){ //указываем уникальный ключ для кеш-файла $string = 'my-unique-key'; //получаем данные кеш-файла по указанному ключу $file = $rcl_cache->get_file($string); //проверяем актуальность кеш-файла if(!$file->need_update){ //возвращаем содержимое кеш-файла return $rcl_cache->get_cache(); } } //Допустим, что кешируемый контент - вывод списка публикаций типа 'post' $posts = get_posts(); //формируем контент списка публикаций $content = '<ul>'; foreach($posts as $post){ $content .= '<li><a href="'.get_permalink($post->ID).'">'.get_the_title($post->ID).'</a></li>'; } $content .= '</ul>'; //проверяем используется ли кеш if($rcl_cache->is_cache){ //создаем или обновляем кеш-файл с сформированным контентом $rcl_cache->update_cache($content); } //возвращаем контент return $content;
Это основы использования функционала кеширования.
В указанном выше примере время кеширования и категория пользователей для кого контент будет кешироваться будет определяться из общих настроек плагина. В случае, если нам необходимо указать свое время кеширования, то следует передать значение времени в секундах первым аргументом при инициализации класса Rcl_Cache:
$rcl_cache = new Rcl_Cache(86400);
Если же нам необходимо кешировать данный контент только для гостей, независимо от общих настроек кеширования, то передаем вторым параметром значение true:
$rcl_cache = new Rcl_Cache(86400,true);
Принудительное обновление кеша
В приведенном примере кеш будет формироваться и обновляться согласно настроек или переданных параметров, но иногда требуется принудительно обновить созданный кеш-файл, например, по определенному событию.
Рассмотрим порядок принудительного обновления кеш-файла по событию.
В нашем случае, будет уместно обновлять кеш-файл списка публикаций при публикации новой записи типа 'post'. Для этого нам потребуется знать уникальный ключ, который мы указали в примере выше для кеш-файла и по которому мы будем в дальнейшем обращаться именно к этому кеш-файлу.
Обратимся к имеющемуся кеш-файлу по ключу и удалим его при публикации новой записи на сайте, для этого используем хук 'wp_insert_post', кеш-файл будет автоматически создан заново при следующем формировании списка публикаций уже с актуальным содержимым:
add_action('wp_insert_post','rcl_update_cache_posts_list',10,3); function rcl_update_cache_posts_list($post_ID, $post, $update){ //Если идет обновление записи или запись не типа 'post' возвращаем false if($update||$post->post_type!='post') return false; //удаляем кеш-файл по переданному ключу rcl_delete_file_cache('my-unique-key'); }
Таким образом, при каждой публикации новой записи типа 'post' указанный кеш-файл будет обновляться принудительно, без необходимости ожидать его обновление по указанному временному интервалу.
В заключении
Хотелось бы дать несколько рекомендаций по использованию данного функционала на сайте.
- Не стоит использовать описанный функционал кеширования от плагина WP-Recall совместно со сторонним кешированием, это может привести к непредсказуемому результату.
- Помните, что использование функционала кеширования на сайте с малой посещаемостью может привести к неоправданным расходам ресурсов сервера на создание кеш-файлов, а не наоборот.
- Не рекомендуется использовать на одной странице большое количество объектов кеширования, если есть возможность, то их лучше объединять в более крупные объекты.
- При создании объекта кеширования его ключ должен быть уникальным, иначе вы будете получать из кеша не тот контент, что ожидали.
Данный функционал был добавлен относительно недавно и сейчас носит скорее экспериментальный характер, будем рады если поделитесь своими наблюдениями и замечаниями при использовании данного функционала.
Объясните мне чем это отличается от WP_Object_Cache, и быстрее ли ваш кеш чем WP_Object_Cache + Memcached? И будет ли поддержка Memcached?
Из описания к WP_Object_Cache:
Тут все "из коробки" и кэш сохраняется на время, которое вы укажете в настройках. Далее кэш берется из файла.
Попробовал закешировать.
В кэш вывел всю главную страницу без хидера и футера (в хидере виджет пользователя и вход - он должен быть актуален)
Результатами доволен:
Было Запросов: 100 | 1,838 Потребление памяти: 61.45MB
стало Запросов: 32 | 0,672 Потребление памяти: 16.56MB
На упадок памяти не смотрите - работа php акселераторов.
Теперь попробую с страницей записи провести эксперименты.
Да хочется еще отметить - выводил 1 объект кеширования, делал замеры, потом выводил 3 объекта кеширования на странице - разницы в нагрузке от трех объектов кеширования не заметил. Возможно на дисковую подсистему она есть - но на виртуальном сервере не имею к ней моментального доступа. Только если тесты оставлять на неделю - в общей статистике покажет что-то. Но затягивать с этим тестом не хочу.
Андрей два вопроса - как полностью очистить кэш? Верно ли функцией rcl_clear_cache (она вообще каталог cache удаляет)?
И второй - кэш весь удаляется сам - раз в сутки по rcl_cron_daily?
Верно, весь кеш очищается путем полного удаления каталога с файлами кеша, можно удалить вручную через функцию rcl_clear_cache(), эта функция также срабатывает раз в сутки по крону.
Это чудесная функция, я начал эксперименты и кое что уже внедрил, результат превзошел ожидания.
Жаль asgaros не закешировать из за его структуры, но и бог с ним, при желании можно с супер кешом извратится в настройках.
На тестовом все, что закешировал просто летает и нет лишней нагрузки от того же супер кеша.
Да - я тоже один сайт закешировал и поделился результатами здесь
Реколл и вкладки кеширует - я почти всем своим дополнениям supports cache прописываю в функции вывода вкладки https://codeseller.ru/api-rcl/rcl_tab/ и если у юзера в настройках включен реколл кеш - то все становится легко и проще
Игорь, а ты, включив кеш от реколл на своем сайте, сделал проверку что плагин активирован? - ну если это отдельный плагин или код в functions.php - то надо проверять - а то отключив реколл "фаталити" в логи запишется 😡
Упс, спасибо за разъяснение, сейчас сделаю проверку.