Кеширование данных в Joomla
В Joomla 1.6 и выше каждый компонент который написан в MVC стиле может быть прокеширован, для включения кеша на уровне компонента нужно в контроллере компонента по умолчанию изменить переменную $cachable в функции display с false на true например:
class MyComponentController extends JController { function display( $cachable = true ) { $this->default_view = 'category'; parent::display( $cachable ); } }
Такое кеширование имеет один существенный недостаток! так как кешируется весь вид и все плагины которые были использованы в этом виде, и при выводе контролер проверяет или есть эта страница в кеше и обходя работу шаблона и модуля будут грузить все данные из файла, в итоге будет уже полностью отработанный скрипт, в этом случае если первым зайдет администратор и для него будут отображены какие то скрытые элементы то для обычного пользователя они тоже будут видны!
В этом случае конечно можно отключать кеширование для администратора, но можно и кешировать отдельные запросы для компонента и отключить полное кеширование!
Для кеширования нужно создать объект класса JCache:
$cache = JFactory::getCache( 'cache_name', '' );
Даже если кеширование в настройках отключено мы можем принудительно включить кешиирование дописав строку:
$cache->setCaching(true);
После этого нам нужно проверить или данные прокешированны и если данных нет в кеше то получить данные, допустим из таблицы, и внести их в кеш для дальнейшего использования. Для этого используем следующий код
$cache = JFactory::getCache( 'cache_name', '' ); //проверяем или данные с $id не вставлены в кеш с названием cache_name if ( !( $items = $cache->get( $id, 'cache_name' ) ) ) { //если данных нет то получаем данные из нужного нам хранилища допустим $db = JFactory::getDbo(); $query = $db->getQuery( true ); $query->select( '*' )->from( '#__content' )->where( 'state=1' ); $items = $db->setQuery( $query )->loadObjectList(); //кешируем данные //первый параметр данные для кеширования, второй идентификатор третий название кеша $cache->store( $items, $id, 'cache_name' ); }
После второго вызова данного кода в переменной $items будут данные уже не с базы данных а с прокешировнных данных
для очистки кеша нужно вызвать метод remove($id, 'cache_name')