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

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

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

Проблема в том, что приложения очень медленные .

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

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

Мысли

Ответы [ 12 ]

39 голосов
/ 11 сентября 2008

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

9 голосов
/ 11 сентября 2008

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

6 голосов
/ 11 сентября 2008

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

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

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

3 голосов
/ 15 сентября 2008

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

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

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

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

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

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

2 голосов
/ 30 марта 2013

Также вы можете использовать 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

2 голосов
/ 13 сентября 2008

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

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

2 голосов
/ 12 сентября 2008

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

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

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

1 голос
/ 12 сентября 2008

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

1 голос
/ 12 сентября 2008

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

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

0 голосов
/ 13 мая 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...