Использование кэширования в Joomla

06/01/2010 Документация Joomla 1.5

Кэшириование в 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