При создании собственного расширения для сайта на движке Joomla в большинстве случаев не помешает оценить объем расходуемой памяти и время исполнения кода скриптов, чтобы оптимизировать скрипты с целью снижения нагрузки на сервер и увеличения производительности создаваемого расширения. Помочь в этом может встроенный в Joomla класс JProfiler.
Хотя в принципе в любом PHP коде можно использовать метод, описанный в статье Объем памяти и время работы PHP скрипта, мы все же рассмотрим на конкретном примере использование для Joomla ее родного класса JProfiler для оценки расхода памяти и времени исполнения кода расширений Joomla.
Для начала можно подготовить тестовый компонет, в котором можно будет проверить работу профилировщика JProfiler.
Создадим в каталоге /components/ своего сайта подкаталог /com_test_1/ и в нем файл test_1.php, в который собственно и будем вставлять код для тестирования. В результате у нас должен получиться следующий локальный путь к файлу:
/components/com_test_1/test_1.php
Чтобы вызвать из браузера созданное нами расширение, нужно выполнить простой GET-запрос:
http://ваш-домен.ru/index.php?option=com_test_1
Правда Joomla может не очень охотно принять во внимание искусственно нами созданное расширение, и во избежание проблем просто вручную добавим в базу данных Joomla 1.6-2.5 в таблицу «префикс_extensions» расширение с именем «com_test_1».
Теперь настало время провести тест, чтобы измерить с помощью профилировщика время выполнения кода нашего расширения и расходуемую им память сервера. Для этого добавим в созданный нами ранее файл test_1.php следующий код:
mark('Начало'); // устанавливаем метку "Старт" $a = str_repeat("Booo!\n", 100000); // заносим очень длинную строку в переменную $a $p->mark('Метка №1'); // устанавливаем метку "Метка №1" sleep(2); // делаем паузу в 2 секунды $b = str_repeat("Booo!\n", 500000); // заносим еще более длинную строку в переменную $b $p->mark('Метка №2'); // устанавливаем метку "Метка №2" unset( $a, $b ); // уничтожаем переменные $a и $b $p->mark('Стоп'); // устанавливаем метку "Стоп" // Получаем все метки с информацией о времени и памяти // и выводим информацию на экран echo '
'; $str = $p->getBuffer(); foreach ($str as $i => $metka) { echo '
' . $metka; } ?>
Теперь вызовем на исполнение созданное нами расширение при помощи запроса GET из адресной строки браузера
http://ваш-домен.ru/index.php?option=com_test_1
В результате на экране мы должны получить от профилировщика JProfiler лог анализа расхода памяти и времени исполнения кода расширения Joomla:
В первой строке мы получили данные от метки «Начало» о том, что с момента начала работы нашего скрипта было израсходовано 4.47 MB памяти.
Во второй строке результаты метки «Метка №1» показали, что после занесения очень длинной строки в переменную $a нашего скрипта память была уже израсходована на 573 Кб больше.
Третья строка содержит отчет метки «Метка №2» и показывает, что после срабатывания в скрипте паузы (sleep(2);) и занесения второй очень длинной строки в переменную $b время выполнения скрипта заняло уже 2.005 секунды, а расход памяти увеличился еще почти на 2.861 Кбайт.
Ну и наконец в последней строке мы получили отчет от метки «Стоп», где видно, что общее время исполнения скрипта нашего фиктивного расширения составило 2,006 секунд, а объем занятой памяти снова уменьшился до начального значения в 4.47 MB, и в этом нам поспособствовала добавленная в скрипт функция unset( $a, $b ), которая уничтожила переменные $a и $b и тем самым высвободила ранее занятую ими память.
Кроме приведенного в примере метода mark('Метка') в других случаях возможно полезно будет использовать и другие методы класса JProfiler:
- $p->getMemory() - получить информацию об использовании памяти в текущий момент;
- $p->getBuffer() - возвращает массив всех меток, использованных методом mark('Метка');
- $p->getmicrotime() - возвращает текущее время;
Приведенный пример конечно слишком упрощен, но поняв методику применения профилировщика класса JProfiler вы сможете использовать его для анализа и оптимизации своих расширений для Joomla.
Метки: Joomla, время, память, расширение