0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: php, php программирование, профилирование кода в php, язык программирования php, xdebug, xhprof, логирование, phpunit</p>
1
<p>Теги: php, php программирование, профилирование кода в php, язык программирования php, xdebug, xhprof, логирование, phpunit</p>
2
<p>В мире современного ПО и высоких скоростей разработки можно смело говорить о том, что ни один процесс написания программного кода не обходится без ошибок. Поиск логических ошибок возможен почти всегда - для этого есть фреймворки семейства<strong>xUnit</strong>и другие. Быстро вырастающие в объёмах проекты сталкиваются с проблемой более серьёзной - это потребление памяти и оптимальность кода.</p>
2
<p>В мире современного ПО и высоких скоростей разработки можно смело говорить о том, что ни один процесс написания программного кода не обходится без ошибок. Поиск логических ошибок возможен почти всегда - для этого есть фреймворки семейства<strong>xUnit</strong>и другие. Быстро вырастающие в объёмах проекты сталкиваются с проблемой более серьёзной - это потребление памяти и оптимальность кода.</p>
3
<p>Зачастую на входе задачи решаются на базе малых объёмов данных и малого числа входящих запросов. С их ростом успешно работающий код перестаёт удовлетворять заказчиков. Чтобы избавиться от проблем подобного рода, в<strong>языке PHP</strong>придумано множество различных способов<strong>анализа работы приложений</strong>.</p>
3
<p>Зачастую на входе задачи решаются на базе малых объёмов данных и малого числа входящих запросов. С их ростом успешно работающий код перестаёт удовлетворять заказчиков. Чтобы избавиться от проблем подобного рода, в<strong>языке PHP</strong>придумано множество различных способов<strong>анализа работы приложений</strong>.</p>
4
<h2>Логирование состояния переменных</h2>
4
<h2>Логирование состояния переменных</h2>
5
<p>Начиная со встроенных функций, отслеживающих потребление ресурсов, разработчик может отследить связь между ростом нагрузки и ростом потребления ресурсов. Самой простым методом трассировки кода является<strong>логирование</strong>состояния переменных в тот или иной момент времени. Для этого достаточно написать довольно простую функцию, которая будет сохранять значение переменной в файл для последующего анализа:</p>
5
<p>Начиная со встроенных функций, отслеживающих потребление ресурсов, разработчик может отследить связь между ростом нагрузки и ростом потребления ресурсов. Самой простым методом трассировки кода является<strong>логирование</strong>состояния переменных в тот или иной момент времени. Для этого достаточно написать довольно простую функцию, которая будет сохранять значение переменной в файл для последующего анализа:</p>
6
function _log($variable, $filename){ $fileHandler = fopen($filename, "a"); if(!$fileHandler){ throw new Exception("File " . $filename . " not found"); } else{ $result = ">>> " . date("Y-m-d H:i:s") . "\r\n"; if(is_array($variable) || is_object($variable)){ $result .= print_r($variable, true); } else{ $result .= $variable; } $result .= "\r\n\r\n"; fwrite($fileHandler, $result); fclose($fileHandler); } }<p>Разумеется, эту функцию можно и нужно доработать проверками на существование директорий и создание директорий при возможности, но она показывает базовый функционал, который позволяет отслеживать состояние переменной в любой момент выполнения программы. Помните, что операции с диском довольно медленные, поэтому использовать подобное логирование в<strong>Production-среде</strong>нужно очень аккуратно.</p>
6
function _log($variable, $filename){ $fileHandler = fopen($filename, "a"); if(!$fileHandler){ throw new Exception("File " . $filename . " not found"); } else{ $result = ">>> " . date("Y-m-d H:i:s") . "\r\n"; if(is_array($variable) || is_object($variable)){ $result .= print_r($variable, true); } else{ $result .= $variable; } $result .= "\r\n\r\n"; fwrite($fileHandler, $result); fclose($fileHandler); } }<p>Разумеется, эту функцию можно и нужно доработать проверками на существование директорий и создание директорий при возможности, но она показывает базовый функционал, который позволяет отслеживать состояние переменной в любой момент выполнения программы. Помните, что операции с диском довольно медленные, поэтому использовать подобное логирование в<strong>Production-среде</strong>нужно очень аккуратно.</p>
7
<h2>XDebug и XHProf</h2>
7
<h2>XDebug и XHProf</h2>
8
<p>Далее в игру вступают модули, написанные сообществом разработчиков -<strong>XDebug</strong>и<strong>XHProf</strong>.</p>
8
<p>Далее в игру вступают модули, написанные сообществом разработчиков -<strong>XDebug</strong>и<strong>XHProf</strong>.</p>
9
<p>Первое расширение является<strong>отладчиком</strong>, который умеет выводить на экран<strong>трассировку стека</strong>(подробной цепочки вызовов функции или метода в случае ошибки), упорядочивать вывод<strong>var_dump</strong>, интегрироваться с IDE и многое другое. Он является крайне необходимым при юнит-тестировании, так как тот же<strong>PHPUnit</strong>зависит от XDebug. Очень здорово, что XDebug содержится в репозиториях различных Linux-систем, поэтому поставить его не составляет труда. В Debian-подобных системах, например, установка будет выглядеть так:</p>
9
<p>Первое расширение является<strong>отладчиком</strong>, который умеет выводить на экран<strong>трассировку стека</strong>(подробной цепочки вызовов функции или метода в случае ошибки), упорядочивать вывод<strong>var_dump</strong>, интегрироваться с IDE и многое другое. Он является крайне необходимым при юнит-тестировании, так как тот же<strong>PHPUnit</strong>зависит от XDebug. Очень здорово, что XDebug содержится в репозиториях различных Linux-систем, поэтому поставить его не составляет труда. В Debian-подобных системах, например, установка будет выглядеть так:</p>
10
sudo apt-get install php5-xdebug<p>После установки требуется просто перезагрузить веб-сервер, работающий с интерпретатором<strong>PHP</strong>.</p>
10
sudo apt-get install php5-xdebug<p>После установки требуется просто перезагрузить веб-сервер, работающий с интерпретатором<strong>PHP</strong>.</p>
11
<p>Главной проблемой XDebug является то, что в Production-среде его использовать<strong>нельзя</strong>, так как он создаёт значительную нагрузку на приложение. А часто возникает ситуация, которую воспроизвести на<strong>Dev-среде</strong>просто не получается.</p>
11
<p>Главной проблемой XDebug является то, что в Production-среде его использовать<strong>нельзя</strong>, так как он создаёт значительную нагрузку на приложение. А часто возникает ситуация, которую воспроизвести на<strong>Dev-среде</strong>просто не получается.</p>
12
<p>Глубокой модернизацией<strong>XDebug</strong>(а по сути - уже самостоятельным продуктом) является детище разработчиков Facebook - модуль<strong>XHProf</strong>. Он вполне может работать на Production-сайтах, создавая минимум нагрузки.</p>
12
<p>Глубокой модернизацией<strong>XDebug</strong>(а по сути - уже самостоятельным продуктом) является детище разработчиков Facebook - модуль<strong>XHProf</strong>. Он вполне может работать на Production-сайтах, создавая минимум нагрузки.</p>
13
<p>Установка системы проста:</p>
13
<p>Установка системы проста:</p>
14
sudo apt-get install php5-xhprof<p>После этого в коде можно использовать подключение этого механизма профилирования:</p>
14
sudo apt-get install php5-xhprof<p>После этого в коде можно использовать подключение этого механизма профилирования:</p>
15
// Инициализация профилирования xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); // Старт приложения Application::run(); // Остановка профилирования $xhprof_data = xhprof_disable(); // теперь мы можем сохранить результаты для вывода на экран include_once "/var/www/xhprof-0.9.5/xhprof_lib/utils/xhprof_lib.php"; include_once "/var/www/xhprof-0.9.5/xhprof_lib/utils/xhprof_runs.php"; $xhprof_runs = new XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, "test");<p><em>Узнать больше вы всегда сможете на курсе<a>"Backend-разработчик на PHP"</a>. Изучайте языки программирования вместе с нами и задавайте вопросы в комментариях!</em></p>
15
// Инициализация профилирования xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); // Старт приложения Application::run(); // Остановка профилирования $xhprof_data = xhprof_disable(); // теперь мы можем сохранить результаты для вывода на экран include_once "/var/www/xhprof-0.9.5/xhprof_lib/utils/xhprof_lib.php"; include_once "/var/www/xhprof-0.9.5/xhprof_lib/utils/xhprof_runs.php"; $xhprof_runs = new XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, "test");<p><em>Узнать больше вы всегда сможете на курсе<a>"Backend-разработчик на PHP"</a>. Изучайте языки программирования вместе с нами и задавайте вопросы в комментариях!</em></p>
16
16