Использование кэширования в Joomla
Кэшириование в Joomla использовать достаточно легко.
Перед тем как использовать кэширование, мы должны убедиться в том, что кэшируемая функция действительно работает быстрее чем функция без кэша. Для этого можно использовать анализа производительности кода.
Создадим элементарный компонент
/components/com_testcache/testcache.php
Посмотрим следующий код
<?php
// Create the profiler object.
$profiler = new JProfiler();
// Do some stuff.
echo $profiler->mark( ' seconds to do stuff' );
?>
Результатом будет что-то вроде
seconds to do stuff: 0.000 seconds, 3.87 MB
Создадим простой класс и метод
<?php
// No direct access.
defined( '_JEXEC' ) or die( 'Restricted access' );
class TestClass {
function testMethod() {
// Get a reference to the global database object.
$db = & JFactory::getDBO();
// Execute the same database query 250 times.
for ($i=0; $i<250; $i++) {
$db->setQuery( 'SELECT * FROM #__content' );
$rows = $db->loadObjectList();
}
return $rows;
}
}
// Run the test.
$rows = TestClass::testMethod();
?>
Здесь можно увидеть что происходит 250 обращений к БД, результат работы этой функции будет очень медленный. Конечно в реальности такого делать не нужно :).
Объект кэша
В начале нужно убедиться что включено кэширование в глобальной конфигурации сайта.
Получаем информацию использую класс JFactory
<?php
$cache = & JFactory::getCache();
?>
Если вы хотите что бы ваш компонент кэшировался не зависимо от глобальной конигурации, то это можно установить
<?php
$cache->setCaching( 1 );
?>
Даьлше используем метод call
<?php
$rows = $cache->call( array( 'TestClass', 'testMethod' ) );
?>
Если нужно кэшировать функцию, которая не находится в классе, то массив использовать не нужно
<?php
$rows = $cache->call( 'testFunction' );
?>
Для очистки кэша можно использовать следующий метод
<?php
$cache->cleanCache();
?>
Этод метод удалит все файлы в папке /cache
<?php
class TestClass {
function testMethod() {
// Get a reference to the global database object.
$db = & JFactory::getDBO();
// Execute the same database query 250 times.
for( $i=0; $i<250; $i++) {
$db->setQuery( 'SELECT * FROM #__content' );
$rows = $db->loadObjectList();
}
return $rows;
}
}
// Get a reference to the global cache object.
$cache = & JFactory::getCache();
// Run the test without caching.
$profiler = new JProfiler();
$rows = TestClass::testMethod();
echo $profiler->mark( ' without caching' );
// Run the test with caching.
$profiler = new JProfiler();
$rows = $cache->call( array( 'TestClass', 'testMethod' ) );
echo $profiler->mark( ' with caching' );
?>
При первой загрузки получим следующее
without caching: 1.453 seconds, 4.16 MB
with caching: 1.551 seconds, 4.19 MB
Теперь обновим страницу и результат будет уже
without caching: 1.452 seconds, 4.16 MB
with caching: 0.005 seconds, 4.16 MB
Результат сам говорит за себя. По умолчанию время жизни кэша в Joomla стоит 900 секунд.
Использование параметров
В этом примере функция возвращает одни и те же данные снова и снова. Однако, часто вы будете писать функции, которые принимают некоторые аргументы и выбирают различные данные. Для этого достаточно просто добавить аргументы вызова. Немного расширим наш пример добавив переменную вместо таблицы.
<?php
class TestClass {
function testMethod( $table ) {
// Get a reference to the global database object.
$db = & JFactory::getDBO();
// Execute the same database query 250 times.
for( $i=0; $i<250; $i++) {
$db->setQuery( "SELECT * FROM #__$table" );
$rows = $db->loadObjectList();
}
return $rows;
}
}
// Determine which database table to query.
$table = JRequest::getVar( 'table', 'content' );
// Get a reference to the global cache object.
$cache = & JFactory::getCache();
// Run the test without caching.
$profiler = new JProfiler();
$rows = TestClass::testMethod( $table );
echo $profiler->mark( ' without caching' );
// Run the test with caching.
$profiler = new JProfiler();
$rows = $cache->call( array( 'TestClass', 'testMethod' ), $table );
echo $profiler->mark( ' with caching' );
?>
Вы можете посмотреть результат работы в своем тестовом компоненте, задавая различные значения для переменной $table.
index.php?option=com_testcache&table=content
index.php?option=com_testcache&table=users
index.php?option=com_testcache&table=menu
Если нужно вызвать функцию экземпляра класса ($something->somefunction или something::somefunction) вы можете использовать
$something=$this->SomeOtherfunction;
$mySomething=$cache->call( array( $something, 'somefunction' ), 'par1','par2','par3');
Вы можете передать параметры, разделеные запятой как указано в примере выше.
Подводим итоги
Этот пример просто демонстрирует использование кэша. При написании реальных расширений конечно навряд ли вы будете использовать 250 запросов к БД. Однако использование кэширование не всегда ускоряет работу скрипта. Вы можете просто удалить цикл в этом примере и убедиться в этом. Поэтому важно использовать анализа производительности кода, что бы убедиться действительно ли кэширование может ускорить работу вашего кода. Кэширование в основном используется при очень больших БД.
Так же важно помнить что функция может кэшироваться если она возвращает одни и те же данные каждый раз для данного набора параметров.
Источник: Using caching to speed up your code
7