Секреты кэширования в Joomla 1.5
Обычно в вебе, один и то же контент отображается снова и снова. Кэширование позволяет увеличить скорость генерации, сохраняя уже сгенерированную страницу в файл. Есть разные способы сделать это, но я рассмотрю только один из методов. Хочу обрадовать, что в joomla кэширование реализуется очень просто:)
Используем JProfiler
При использовании функции кэширования вам наверняка будет интересно узнать насколько ускорился ваш скрипт. Для этого мы будем использовать класс joomla JProfiler.
<?php // Создаем объект JProfiler. $profiler = new JProfiler(); // Отображаем время. echo $profiler->mark( ' секунд прошло' ); ?>
Создаем тестовую функцию
Мы сделаем небольшой компонент, который фактически ничего не делает, но на его примере, я покажу как рассчитать время, необходимое для выполнения функции. Во-первых нужно создать файл компонента:
/components/com_testcache/testcache.php
В файле создадим класс с одним методом:
<?php
// нет прямого допуска.
defined( '_JEXEC' ) or die( 'Restricted access' );
class TestClass {
function testMethod() {
// подключаемся к бд.
$db = & JFactory::getDBO();
// выполняем 250 запросов в бд.
for ($i=0; $i<250; $i++) {
$db->setQuery( 'SELECT * FROM #__content' );
$rows = $db->loadObjectList();
}
return $rows;
}
}
// запускаем наш метод.
$rows = TestClass::testMethod();
?>
250 запросов - это много. Но так мы заметим разницу в производительности с кэшированием и без него.
Объект кэширования
Для начала включите кэширование в глобальных настройках cms joomla.
Теперь создадим ссылку на класс кэширования через JFactory
<?php $cache = & JFactory::getCache(); ?>
Если вы хотите, чтобы ваш компонент использовал кэширование, даже если оно отключено в глобальной конфигурации, Вы можете настроить его сами:
<?php $cache->setCaching( 1 ); ?>
Далее вызовим наш метод через объект кэширования:
<?php $rows = $cache->call( array( 'TestClass', 'testMethod' ) ); ?>
Если мы хотим вызвать кэширование конкретной функции, то не нужно использовать массив:
<?php $rows = $cache->call( 'testFunction' ); ?>
Во время тестирования кода, мы можем использовать следующий метод для очистки кэша:
<?php $cache->cleanCache(); ?>
Этот метод удалит все файлы из папки /cache
Теперь объеденим все вместе
Чтобы сравнить производительность, вызываем наш метод два раза. Один разу через объект кэша, и один раз без него:
<?php
class TestClass {
function testMethod() {
$db = & JFactory::getDBO();
for( $i=0; $i<250; $i++) {
$db->setQuery( 'SELECT * FROM #__content' );
$rows = $db->loadObjectList();
}
return $rows;
}
}
// создаем объект кэша
$cache = & JFactory::getCache();
// тестируем без кэша
$profiler = new JProfiler();
$rows = TestClass::testMethod();
echo $profiler->mark( ' без кэша' );
// тестируем с кэшем
$profiler = new JProfiler();
$rows = $cache->call( array( 'TestClass', 'testMethod' ) );
echo $profiler->mark( ' с кэшем' );
?>
Теперь запускаем наш компонент через index.php?option=com_testcache. Первые результаты будут такими:
2.093 без кэша
2.160 с кэшем
Результат с кэшированием получился больше, потому что некоторое время ушло на запись кэша в файл. Теперь перезагрузим страницу в броузере.
2.073 без кэша
0.008 с кэшем
Нехилые результаты?:) а теперь умножьте выигранное время на колличество посетителей, и поймете свой реальный выигрыш;)
Кеширования HTML вывода в Joomla
Joomla позволяет кешировать отдельные части шаблонов, компонентов, а именно их вывод. Для этого необходимо создать объект кеша с обработчиком "output", так как показано
Создается кеш-объект c обработчиком "output". "com_test" в данном случае - это место хранения кеша: /cache/com_test ( в случае файлового кеша)
Далее выбирается идентификатор кеширования. Он должен зависеть например от внешних условий расширения. Таким образом для разных страниц, с разными Itemid будет создаваться разный кеш и не будет путаницы. В принципе можно подставлять сериализованые массивы с текущими параметрами вызова и прочее. Хорошим вариантом можно считать следующий вариант:
$Itemid = JRequest::getvar('Itemid', 1);
$id = JRequest::getvar('id');
$cache_id = $Itemid .'_'. $id .'_'. $lastModifiedId;
Таким образом обновление произойдет автоматический сброс при изменении элемента администратором сайта.
Внимание: Будте осторожны с выбором идентификатора кеша. Например использование следующих вариантов грозит резким ростом размера кеша, особенно на больших сайтах с высокой посещаемостью. Эффективность кеширования пойдет к нулю, более того в какой-то мере это можно считать дырой в безопасности сайта.
$cache_id = serialize($_GET); $cache_id = serialize($_REQUEST);
Далее начинаем непосредственный перехват вывода. Если файл кеша отсутствует или истек период его жизни, то функция start() вернет "false", в противном случае функция вернет "true".
В случае просроченного/отсутсвующего кеша - запуститься буферизация вывода. Заканчивается буферизация после выполнения end(). Если start() вернул "true", будет использован тот текст, который хранился с прошлого раза в файлах кеша.
