Узнайте, где ваш PHP-код тормозит (проблема с производительностью)

Вот мой первый вопрос в SO.

У меня есть внутреннее приложение для моей компании, которое меня недавно попросили поддерживать. Приложения построены на PHP, и его довольно хорошо закодированный (OO, DB Abstraction, Smarty) ничего лишнего.

Проблема в приложениях - очень медленно.

Как мне узнать, что замедляет работу приложения? Я оптимизировал код, чтобы делать очень мало запросов к БД, поэтому я знаю, что это код PHP, который требует времени для выполнения. Мне нужны инструменты, которые могут мне в этом помочь, и нужно разработать стратегию проверки моего кода.

Я могу сам выполнить проверку / стратегию, но мне нужно больше инструментов PHP, чтобы выяснить, где мое приложение не работает.

Мысли?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
30
0
27 124
12
Перейти к ответу Данный вопрос помечен как решенный

Ответы 12

Ответ принят как подходящий

Я недавно использовал Профилирование XDebug в похожей ситуации. Он выводит полный отчет о профиле, который можно прочитать с помощью многих распространенных приложений для профилирования (хотя я не могу дать вам список, я просто использовал тот, который поставляется со Slackware).

Мы используем Zend Development Environment (windows). Вчера мы устранили всплеск использования памяти, пройдя через отладчик при запуске Process Explorer, чтобы наблюдать за активностью памяти / процессора / диска при выполнении каждой строки.

Обозреватель процессов: http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx.

ZDE включает базовый профилировщик производительности, который может отображать время, затраченное на каждый вызов функции во время запросов страницы.

Я использую комбинацию Тест PEAR и log4php.

В верхней части скриптов, которые я хочу профилировать, я создаю объект, который оборачивается вокруг объекта Benchmark_Timer. По всему коду я добавляю вызовы $object->setMarker("name");, особенно вокруг подозрительного кода.

Класс-оболочка имеет метод уничтожения, который берет информацию журнала и записывает ее в log4php. Я обычно отправляю это в системный журнал (многие серверы, объединяются в один файл журнала на одном сервере).

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

Это не xdebug, но он всегда включен и дает мне возможность сравнивать любые два выполнения кода.

Несмотря на то, что я собираюсь использовать XDebug, я проверю Pear Benchmark. Я могу использовать это в других проектах

Rushi 11.09.2008 19:28

Как сказал Хуан, xDebug превосходен. Если вы используете Windows, WinCacheGrind позволит вам просматривать отчеты.

У меня есть машина с окнами, которую я могу найти с пользой

Rushi 11.09.2008 19:27

KCacheGrind (KDE / Linux) намного лучше.

blueyed 19.02.2010 04:44

Посмотрите презентацию Расмуса Лердорфа (создателя PHP). Он приводит несколько хороших примеров тестирования скорости PHP и то, что нужно искать, а также некоторые внутренние механизмы, которые могут замедлить работу. XDebug - один из инструментов, которые он использует. Он также очень твердо говорит о том, во сколько вы теряете производительность с фреймворками.

Видео: http://www.archive.org/details/simple_is_hard

Слайды (так как на видео плохо видно): http://talks.php.net/show/drupal08/1

Если это большая база кода, попробуйте apc, если вы еще этого не сделали.

http://pecl.php.net/package/APC

Привет. Если бы вы пересмотрели свой вопрос, вы бы оставили его как есть? Однако вы, вероятно, знаете, что делать, поэтому я оставлю это вам. Пожалуйста, включите соответствующие части вашей ссылки :)

Félix Gagnon-Grenier 05.02.2015 21:16

phpED (http://www.nusphere.com/products/phped.htm) также предлагает отличную отладку и профилирование, а также возможность добавлять часы, точки останова и т. д. в код PHP. Интегрированный профилировщик напрямую предлагает разбивку по времени каждого вызова функции и метода класса из среды IDE. Плагины браузера также обеспечивают быструю интеграцию с Firefox или IE (т.е. посетите медленный URL-адрес в браузере, затем нажмите кнопку для профилирования или отладки).

Было очень полезно указать, где приложение работает медленно, чтобы сконцентрировать большую часть усилий по кодированию; и это позволяет избежать траты времени на оптимизацию и без того быстрого кода. Попробовав Zend и Eclipse, я убедился в простоте использования phpED.

Имейте в виду, что и Xdebug, и phpED (с DBG) потребуют установки дополнительного модуля PHP при отладке на веб-сервере. phpED также предлагает (не опробованный мной) вариант локальной отладки.

вы также можете попробовать использовать функцию register_tick_function в php. который сообщает php периодически вызывать определенную функцию в вашем коде. Затем вы можете отслеживать, какая функция в настоящее время выполняется, и количество времени между вызовами. тогда вы сможете увидеть, на что уходит больше всего времени. http://www.php.net/register_tick_function

Профиль Xdebug - определенно лучший вариант. Еще один совет - WincacheGrind хорош, но в последнее время не обновлялся. http://code.google.com/p/webgrind/ - в браузере может быть простой и быстрой альтернативой.

Впрочем, скорее всего, это все равно база данных. Проверьте соответствующие индексы и убедитесь, что у него достаточно памяти для кэширования как можно большего количества рабочих данных.

Есть много переменных, которые могут повлиять на производительность вашего приложения. Я рекомендую вам не сразу же предполагать, что проблема в PHP.

Во-первых, как вы обслуживаете PHP? Вы пробовали базовую оптимизацию Apache или самого IIS? Сервер занят обработкой других запросов? Вы воспользовались Ускоритель кода PHP? Один из способов проверить, является ли сервер вашим узким местом, - это попробовать запустить приложение на другом сервере.

Во-вторых, работает ли приложение в целом медленно или это влияет только на определенные страницы? Это может дать вам представление о том, с чего начать анализ производительности. Если все приложение работает медленно, проблема с большей вероятностью связана с базовым сервером / платформой или с глобальным запросом SQL, который является частью каждого запроса (например, аутентификация пользователя).

В-третьих, вы упомянули минимизацию количества SQL-запросов, но как насчет оптимизации существующих запросов? Если вы используете MySQL, пользуетесь ли вы преимуществами различных сильных сторон каждой системы хранения? Вы запускали ОБЪЯСНЯТЬ для своих наиболее важных запросов, чтобы убедиться, что они правильно проиндексированы? Это очень важно для запросов, обращающихся к большим таблицам; чем больше набор данных, тем сильнее вы заметите последствия плохой индексации. К счастью, есть много статей такой как этот, в которых объясняется, как использовать EXPLAIN.

В-четвертых, распространенной ошибкой является предположение, что ваш сервер базы данных будет автоматически использовать все ресурсы, доступные системе. Вы должны убедиться, что вы явно выделили достаточно ресурсов для своего приложения базы данных. В MySQL, например, вы захотите добавить пользовательские настройки (в свой файл my.cnf) для таких вещей, как буфер ключей, размер временной таблицы, параллелизм потоков, размер пула буферов innodb и т. д.

Если вы дважды проверили все вышеперечисленное и все еще не можете найти узкое место, профилировщик кода, такой как Xdebug, определенно может помочь. Лично я предпочитаю профилировщик Zend Studio, но он может быть не лучшим вариантом, если вы уже не пользуетесь остальной частью стека Zend Platform. Однако, по моему опыту, очень редко сам PHP является основной причиной низкой производительности. Часто профилировщик кода может помочь вам с большей точностью определить, какие запросы к БД виноваты.

Ты тоже прав. Я действительно посмотрел на то, что было с базой данных, и мне показалось, что все в порядке. Проблема была с Apache, но она была исправлена. Я также установлю программу кеширования кода операции. Но все же профилирование вашего приложения в любом случае помогает улучшить общее программирование.

Rushi 21.09.2008 08:42

Также вы можете использовать APD (Advanced PHP Debugger).

Заставить его работать довольно просто.

$ php apd-test.php

$ pprofp -l pprof.SOME_PID

Trace for /Users/martin/develop/php/apd-test/apd-test.php
Total Elapsed Time = 0.12
Total System Time  = 0.01
Total User Time    = 0.07


         Real         User        System             secs/    cumm
%Time (excl/cumm)  (excl/cumm)  (excl/cumm) Calls    call    s/call  Memory Usage Name
--------------------------------------------------------------------------------------
71.3 0.06 0.06  0.05 0.05  0.01 0.01  10000  0.0000   0.0000            0 in_array
27.3 0.02 0.09  0.02 0.07  0.00 0.01  10000  0.0000   0.0000            0 my_test_function
 1.5 0.03 0.03  0.00 0.00  0.00 0.00      1  0.0000   0.0000            0 apd_set_pprof_trace
 0.0 0.00 0.12  0.00 0.07  0.00 0.01      1  0.0000   0.0000            0 main

Есть хороший учебник, как скомпилировать APD и сделать с его помощью профилирование: http://martinsikora.com/compiling-apd-for-php-54

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

Lee Taylor 06.02.2015 06:21

Ответ - «Используйте APD». Дополнительная ссылка для тех, у кого проблемы с установкой.

Fedir RYKHTIK 06.02.2015 12:54

Вы также можете взглянуть на HA прокси или любое другое решение для балансировки нагрузки, если снижение производительности вашего сервера является причиной медленной обработки приложения. сервер.

Другие вопросы по теме