Профилирование PHP-приложений с помощью XHProf и XHGui в Ubuntu 14.04
Профилирование в программной инженерии – это метод анализа приложений, позволяющий выявить потенциальные узкие места и проблемы производительности приложения. Профилирование – очень важный источник данных для оптимизации программного обеспечения. Этот метод отличается от сравнительного анализа тем, что он анализирует приложения на уровне кода, в то время как сравнительный анализ позволяет изучить производительность приложений в целом (как их видит конечный пользователь).
Профилировщик (или профайлер) – это программное обеспечение, которое собирает характеристики приложения (данные об использовании памяти, частоте и продолжительности вызовов функций, времени ответа на запрос и т.п.) и генерирует статистику.
XHProf – это открытый профайлер для PHP-приложений от Facebook. XHProf является пассивным профайлером; это значит, что он работает в фоновом режиме, что позволяет уменьшить его влияние на производительность анализируемого приложения.
XHGui – это многофункциональный интерфейс для визуализации данных, собранных с помощью XHProf.
Данное руководство поможет установить XHProf и XHGui и использовать их для профилирования приложений PHP в Ubuntu 14.04.
Примечание: На данный момент XHProf не поддерживает PHP 7. Если на вашем сервере установлена эта версия PHP, используйте tideways/php-profiler-extension вместо XHProf.
Требования
- Сервер Ubuntu 14.04.
- Рабочая среда PHP и запущенное в ней PHP-приложение.
1: Установка зависимостей
Если на вашем сервере нет расширения pecl, установите его сейчас. Также нужно установить PHP-расширения xhprof и mongo.
Сначала обновите индекс пакетов:
sudo apt-get update
Теперь можно установить расширение pecl, которое входит в пакет php-pear. Также нужно установить пакет php5-dev, с помощью которого pecl сможет устанавливать модули PHP, и php5-mcrypt, который пригодится для установки XHGui.
sudo apt-get install php-pear php5-dev php5-mcrypt
Включите расширение mcrypt:
sudo php5enmod mcrypt
Также для установки XHGui нужна система Git. Если она ещё не установлена на сервер, введите команду:
sudo apt-get install git
2: Установка XHProf
Чтобы установить XHProf с помощью pecl, введите:
sudo pecl install xhprof-beta
Теперь нужно включить расширение xhprof. Согласно стандартам Ubuntu/Debian, для этого нужно создать конфигурационный файл ini и включить его с помощью команды php5enmod.
Создайте файл ini в каталоге /etc/php5/mods-available:
sudo nano /etc/php5/mods-available/xhprof.ini
Добавьте в него строку:
extension=xhprof.so
Чтобы включить конфигурационный файл модуля, введите:
sudo php5enmod xhprof
Теперь нужно перезапустить веб-сервер, чтобы изменения вступили в силу. В стеке LAMP (Apache) это делается с помощью команды:
sudo service apache2 restart
В окружении LEMP (Nginx + PHP5-FPM) перезапустить веб-сервер можно с помощью команды:
sudo service php5-fpm restart
Теперь расширение xhprof установлено и включено. Чтобы убедиться, что всё прошло успешно, введите:
php --ri xhprof
Команда должна вернуть:
xhprof
xhprof => 0.9.2
CPU num => 1
3: Установка MongoDB
Теперь нужно установить MongoDB и PHP-расширение mongo. XHGui использует MongoDB для хранения данных, собранных XHProf.
Чтобы установить MongoDB, введите:
sudo apt-get install mongodb
Чтобы установить PHP-расширение MongoDB, запустите команду:
sudo pecl install mongo
Инсталлятор предложит выбрать корпоративную аутентификацию MongoDB; можно оставить значение по умолчанию (no) и просто нажать клавишу Enter, чтобы продолжить установку.
Теперь нужно включить расширение mongo. Это делается точно так же, как и в случае с xhprof. Создайте новый конфигурационный файл в /etc/php5/mods-available/mongo.ini.
sudo nano /etc/php5/mods-available/mongo.ini
Добавьте в него такой код:
extension=mongo.so
Чтобы включить конфигурационный файл, введите:
sudo php5enmod mongo
Перезапустите веб-сервер, чтобы обновить настройки.
LAMP
sudo service apache2 restart
LEMP
sudo service php5-fpm restart
Теперь расширение mongo установлено и включено. Чтобы убедиться в этом, введите:
php --ri mongo
Команда вернёт такой вывод:
mongo
MongoDB Support => enabled
Version => 1.6.12
Streams Support => enabled
SSL Support => enabled
Supported Authentication Mechanisms
MONGODB-CR => enabled
SCRAM-SHA-1 => enabled
MONGODB-X509 => enabled
GSSAPI (Kerberos) => disabled
PLAIN => disabled
...
4: Настройка индексов MongoDB (опционально)
Этот этап опционален, но его рекомендуется выполнить, поскольку он позволяет повысить общую производительность XHGui при хранении и работе с данными MongoDB.
Подключитесь к клиенту MongoDB через командную строку:
mongo
Запустите эту последовательность команд, чтобы создать индексы для XHGui:
use xhprof
db.results.ensureIndex( { 'meta.SERVER.REQUEST_TIME' : -1 } )
db.results.ensureIndex( { 'profile.main().wt' : -1 } )
db.results.ensureIndex( { 'profile.main().mu' : -1 } )
db.results.ensureIndex( { 'profile.main().cpu' : -1 } )
db.results.ensureIndex( { 'meta.url' : 1 } )
Чтобы закрыть клиент MongoDB, введите:
exit
5: Установка XHGui
Теперь нужно установить интерфейс XHGui в качестве виртуального хоста веб-сервера.
Для начала клонируйте репозиторий XHGui с Github. Чтобы веб-сервер мог обслуживать контент XHGui в качестве виртуального хоста, поместите клонированный репозиторий в /var/www.
Рекомендуется передать права на каталог XHGui вашему обычному пользователю. В данном примере такой пользователь называется 8host. Укажите имя своего пользователя и группы.
sudo mkdir -p /var/www/xhgui
sudo chown -R 8host.8host /var/www/xhgui
cd /var/www
git clone https://github.com/perftools/xhgui.git xhgui
Чтобы установить зависимости XHGui, запустите встроенный инсталлятор:
cd xhgui
php install.php
После этого нужно создать виртуальный хост для xhgui.
Создание виртуального хоста для xhgui на Apache
Сначала нужно убедиться, что Apache поддерживает mod_rewrite. Чтобы включить этот модуль, введите:
sudo a2enmod rewrite
Создайте новый виртуальный хост в /etc/apache2/sites-available:
sudo nano /etc/apache2/sites-available/xhgui.conf
Добавьте в файл следующие конфигурации:
<VirtualHost *:80>
DocumentRoot /var/www/xhgui/webroot
ServerName xhgui.example.com
<Directory "/var/www/xhgui/webroot">
Options Indexes MultiViews FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Обратите внимание: директива document root должна указывать на подкаталог webroot в главном каталоге XHGui.
Примечание: Если на данный момент у вас нет поддомена, который вы могли бы использовать для этого виртуального хоста, вы можете использовать фиктивный домен и создать запись в локальном файле /etc/hosts, которая направит ServerName (домен) на IP-адрес сервера.
Чтобы включить виртуальный хост, введите:
sudo a2ensite xhgui
Чтобы обновить настройки, перезапустите Apache:
sudo service apache2 reload
Создание виртуального хоста для xhgui на Nginx
Создайте файл для нового виртуального хоста в /etc/nginx/sites-available:
sudo nano /etc/nginx/sites-available/xhgui
Поместите в него следующие конфигурации:
server {
listen 80;
server_name xhgui.example.com;
root /var/www/xhgui/webroot/;
index index.php;
location / {
try_files $uri $uri/ /index.php?$uri&$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
}
Обратите внимание: директива document root должна указывать на подкаталог webroot в главном каталоге XHGui.
Примечание: Если на данный момент у вас нет поддомена, который вы могли бы использовать для этого виртуального хоста, вы можете использовать фиктивный домен и создать запись в локальном файле /etc/hosts, которая направит ServerName (домен) на IP-адрес сервера.
Чтобы включить виртуальный хост, введите:
sudo ln -s /etc/nginx/sites-available/xhgui /etc/nginx/sites-enabled/xhgui
Перезапустите Nginx:
sudo service nginx restart
6: Настройка XHProf
Теперь вы можете получить доступ к интерфейсу XHGui в веб-браузере. Для этого введите домен, который вы указали в директиве server name. Поскольку на данный момент никаких характеристик не собрано, на экране появится страница:
Recent runs
Looks like you haven’t done any profiling
[…]
Расширение XHProf уже установлено на сервер, однако процесс профилирования пока что не был запущен. Для этого нужно добавить директиву PHP в настройки веб-сервера, что автоматически вставит фрагмент кода во все запущенный PHP-сценарии. Важно отметить, что по умолчанию XHProf профилирует только 1 из 100 запросов, полученных приложением.
XHGui предоставляет стандартный PHP-хедер, который можно добавить в сценарии, чтобы инициализировать профилирование для приложения. Если вы следовали данному руководству, файл header должен находиться в /var/www/xhgui/external/header.php.
Далее показано, как автоматически добавить хедер в сценарии на Apache и Nginx.
Примечание: Для примера в руководстве показано, как включить профилирование для WordPress.
Включение профилирования на Apache
Отредактируйте конфигурационный файл Apache. Для примера включим профилирование для главного сайта Apache, размещённого на этом сервере (файл /etc/apache2/sites-available/000-default.conf). Откройте файл:
sudo nano /etc/apache2/sites-available/000-default.conf
Добавьте в блок <VirtualHost> следующие строки:
<VirtualHost *:80>
...
php_admin_value auto_prepend_file "/var/www/xhgui/external/header.php"
...
</VirtualHost>
Сохраните и закройте файл. Перезапустите Apache:
sudo service apache2 restart
Включение профилирования на Nginx
Отредактируйте конфигурационный файл Nginx. Для примера включим профилирование для сайта default, размещённого на этом сервере (файл /etc/nginx/sites-available/default). Откройте файл:
sudo nano /etc/nginx/sites-available/default
Найдите блок, который предназначен для обработки сценариев .php. Добавьте в него следующие строки:
location ~ \.php$ {
...
fastcgi_param PHP_VALUE "auto_prepend_file=/var/www/xhgui/external/header.php";
...
}
Сохраните и закройте файл. Перезапустите Nginx.
sudo service nginx restart
7: Начало работы с XHGui
Теперь установка полностью готова к работе.
Возможно, пройдёт некоторое время, прежде чем вы получите первые данные профилирования в XHGui (всё зависит от количества просмотров вашего сайта). Также стоит помнить, что по умолчанию XHProf профилирует только 1 из 100 полученных запросов. Чтобы скорее получить данные, попробуйте открыть разные страницы сайта и обновить их несколько раз.
Краткий обзор XHGui
Когда данные будут доступны, на экране вы увидите заголовок Recent runs и несколько столбцов:
- Method: метод, с помощью которого был проанализирован запрос.
- URL: проанализированный URL-адрес.
- Time: время сбора данных профилирования.
- wt (Wall Time): время, которое потребовалось на обработку запроса.
- cpu: время, затраченное процессором на выполнение этого запроса.
- mu (Memory Usage): средний объем использования памяти во время этого запроса.
- pmu (Peak Memory Usage): пик использования памяти во время обработки этого запроса.
Чтобы получить подробную информацию о профиле, используйте ссылку в поле time.
Слева вы увидите информацию о проанализированном запросе (например, метод, название сценария и URL, параметры запроса и т.п.). На этой странице вы сможете определить функции или методы, на выполнение которых ушло больше всего времени и которые использовали больше всего памяти.
Вызов функций
Перейдите в конец страницы, здесь вы найдёте таблицу с подробными данными о всех вызовах функций, выполненных во время запроса (включая количество вызовов, продолжительность выполнения функции, объём использованной памяти и многое другое). Вы также можете использовать поисковое окно справа для поиска конкретной функции или метода по имени.
Сравнение в XHGui
Одной из наиболее полезных функций XHGui является инструмент для сравнения данных, полученных во время двух разных операций профилирования. Это позволяет вам понять, пошли ли на пользу изменения кода и стоит ли ещё работать над оптимизацией производительности.
Справа от раздела Watch Functions вы можете найти кнопку Compare This Run. Нажав на неё, вы увидите список всех операций профилирования, когда-либо запущенных для этого URL-адреса. Выберите профилирование, с которым вы хотите сравнить полученные данные и нажмите Compare.
Заключение
Профилирование – очень важный источник данных для оптимизации программного обеспечения. Эта техника позволяет вам подробно изучить приложение на уровне кода. Инструменты XHProf и XHGui эффективно определяют проблемные фрагменты кода и узкие места. Внеся соответствующие исправления, вы можете существенно повысить производительность приложения.
За подробной информацией о XHGui можно обратиться к репозиторию Github.
Источник - https://www.8host.com/blog/profilirovanie-php-prilozhenij-s-pomoshhyu-xhprof-i-xhgui-v-ubuntu-14-04/
Дайджест новых статей по интернет-маркетингу на ваш email
Новые статьи и публикации
- 2024-11-15 » Перенос сайта на WordPress с одного домена на другой
- 2024-11-08 » OSPanel 6: быстрый старт
- 2024-11-08 » Как установить PhpMyAdmin в Open Server Panel
- 2024-09-30 » Как быстро запустить Laravel на Windows
- 2024-09-25 » Next.js
- 2024-09-05 » OpenAI рассказал, как запретить ChatGPT использовать содержимое сайта для обучения
- 2024-08-28 » Чек-лист: как увеличить конверсию интернет-магазина на примере спортпита
- 2024-08-01 » WebSocket
- 2024-07-26 » Интеграция с Яндекс Еда
- 2024-07-26 » Интеграция с Эквайринг
- 2024-07-26 » Интеграция с СДЕК
- 2024-07-26 » Интеграция с Битрикс-24
- 2024-07-26 » Интеграция с Travelline
- 2024-07-26 » Интеграция с Iiko
- 2024-07-26 » Интеграция с Delivery Club
- 2024-07-26 » Интеграция с CRM
- 2024-07-26 » Интеграция с 1C-Бухгалтерия
- 2024-07-24 » Что такое сторителлинг: техники и примеры
- 2024-07-17 » Ошибка 404: что это такое и как ее использовать для бизнеса
- 2024-07-03 » Размещайте прайс-листы на FarPost.ru и продавайте товары быстро и выгодно
- 2024-07-01 » Профилирование кода в PHP
- 2024-06-28 » Изучаем ABC/XYZ-анализ: что это такое и какие решения с помощью него принимают
- 2024-06-17 » Зачем вам знать потребности клиента
- 2024-06-11 » Что нового в работе Яндекс Метрики: полный обзор обновления
- 2024-06-11 » Поведенческие факторы ранжирования в Яндексе
- 2024-06-11 » Скорость загрузки сайта: почему это важно и как влияет на ранжирование
- 2024-05-27 » Подборка сервисов для расшифровки аудио в текст
- 2024-05-27 » PostgreSQL 16. Изоляция транзакций. Часть 2
- 2024-05-06 » Как настраивать конверсионные стратегии: работа над ошибками
- 2024-04-22 » Комментирование кода и генерация документации в PHP
Власть над собой — высшая власть. Луций Анней Сенека |
Мы создаем сайты, которые работают! Профессионально обслуживаем и продвигаем их , а также по всей России и ближнему зарубежью с 2006 года!
Как мы работаем
Заявка
Позвоните или оставьте заявку на сайте.
Консультация
Обсуждаем что именно Вам нужно и помогаем определить как это лучше сделать!
Договор
Заключаем договор на оказание услуг, в котором прописаны условия и обязанности обеих сторон.
Выполнение работ
Непосредственно оказание требующихся услуг и работ по вашему заданию.
Поддержка
Сдача выполненых работ, последующие корректировки и поддержка при необходимости.