RSS   Twitter   Copiny   Copiny
Нашел ошибку? 

Выдели фрагмент текста с ошибкой или неточностью и нажми Ctrl+Enter!

Кеширование результатов функций и методов классов

Обычно в вебе, один и то же контент отображается снова и снова. Кэширование позволяет увеличить скорость генерации, сохраняя уже сгенерированную страницу в файл. Есть разные способы сделать это, но мы рассмотрим только один из методов.

Используем JProfiler

При использовании функции кэширования вам наверняка будет интересно узнать насколько ускорился ваш скрипт. Для этого мы будем использовать класс joomla JProfiler.

jimport( 'joomla.error.profiler' );
// Создаем объект JProfiler.
$profiler = new JProfiler();
 
// Делаем отметку времени
echo $profiler->mark( ' секунд прошло' );

Если капнуть немного по глубже, то  при включенной отладке (основных настройках сайта), создается глобальная переменная $_PROFILER.

Поэтому как вариант можно использовать несколько другой способ инициализации профайлера:

global $_PROFILER;
JDEBUG ? $_PROFILER->mark('start') : null; // обязательная проверка, включен ли режим отладки
// тяжелый код
JDEBUG ? $_PROFILER->mark('finish') : null; 

 

Создаем тестовую функцию

Мы сделаем небольшой компонент, который фактически ничего не делает, но на его примере, мы покажем как рассчитать время, необходимое для выполнения функции.

Во-первых нужно создать файл компонента: 

/components/com_testcache/testcache.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

$cache = & JFactory::getCache();

Если вы хотите, чтобы компонент использовал кэширование, даже если оно отключено в глобальной конфигурации, можно использовать следующий прием:

$cache->setCaching( 1 );

Далее вызовим наш метод через объект кэширования:

$rows = $cache->call( array( 'TestClass', 'testMethod' ) );

Если мы хотим вызвать кэширование конкретной функции, то не нужно использовать массив:

$rows  = $cache->call( 'testFunction' ); 

Во время тестирования кода, мы можем использовать следующий метод для очистки кэша:

$cache->cleanCache();

Этот метод удалит все файлы из папки /cache. Будте осторожны с использованием этой функции для высоконагруженных проектов - это может серьезно замедлить работу Joomla.

Проверка кеширования на практике

Чтобы сравнить производительность, вызываем наш метод дважды. Один раз через объект кэша, и один раз без него:

<?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 с кэшем

Неплохой выйгрыш, не правда ли?

Выводы по кэшированию в Joomla

Наш пример использует очень медленные запросы к базе данных 250 раз. Мы видим огромное увеличение в скорости. Тем не менее, использование кэш-памяти не всегда ускоряет процесс. Попробуйте значительно уменьшить число запросов и посмотрите сами. Для этого мы и использовали JProfiler, чтобы увидеть результаты ускорения.

И, конечно помните, что кэширование не является заменой для эффективного программирования.

Смотрите также:
Комментарии (5) Добавить комментарий
  • Дмитрий
    Дмитрий
    20 Января 2012, 23:27
     ↑  0  ↓     ответ

    Спасибо, кеш-это вообще полезная штука! а то у меня постоянные перегрузы(будем пытаться оптимизировать сайт!

  • Андрей
    Андрей
    08 Июня 2012, 20:55
     ↑  +1  ↓     ответ

    "Если кОпнуть немного по глубже".

  • Рустам
    Рустам
    26 Сентября 2012, 09:17
     ↑  +6  ↓     ответ

    Для начала включите кэширование в глобальных настройках cms joomla.

    Теперь создадим ссылку на класс кэширования через JFactory

    $cache = & JFactory::getCache();

    Где именно создавать ссылку?

    или где вызывать этот метов

    $rows = $cache->call( array( 'TestClass', 'testMethod' ) );

    Стандартного включения функции кеширования недостаточно?

  • Артем
    Артем
    22 Января 2013, 17:47
     ↑  0  ↓     ответ

    $profiler = new JProfiler();

    $rows = $cache->call( array( 'TestClass', 'testMethod' ) );

    Здесь обычный метод "testMethod" вызывается в контексте класса "TestClass" (как статический) - это не очень хорошо, но это косяк реализации JCache::call в новых версиях PHP - это уже будет не соответствие стандартам.

  • Андрей
    Андрей
    08 Октября 2013, 10:02
     ↑  0  ↓     ответ

    Молодцы! Грамотно расписано использование кэширования.

    Спасибо за идеи!

Оставить комментарий




* обязательно для заполнения

1 введенный почтовый адрес используется только для обратной связи при ответах в комментариях и сервиса gravatar.com
.