Мне было интересно, может ли кто-нибудь дать ответ на высоком уровне о том, как отслеживать функции, которые вызывают замедление.
У нас есть сайт с 6 тысячами строк кода, и время от времени наблюдается значительное замедление.
Мне было интересно, что будет лучшим способом отследить источник этих случайных замедлений? Должны ли мы прикрепить трекер времени выполнения к каждой функции или вы бы порекомендовали что-то еще?
Это стандартная установка стека LAMP с PHP 5.2.9 (без фреймворков).
Единственный способ правильно отследить причину и замедление работы сценария — это использовать профилировщик.
Есть несколько из них, доступных для PHP. Некоторые из них требуют, чтобы вы установили модуль на сервере, некоторые, которые используют библиотеку только для PHP, и другие снова, которые автономны.
Мой предпочтительный профилировщик Zend Studio, главным образом потому, что я использую это как свою IDE. Он имеет преимущество как автономности, так и использования в сочетании с серверными модулями (или пакетом Zend Server). Позволяет вам профилировать как локально, так и в производственных системах.
Однако одной из самых простых вещей является поиск SELECT
запросы внутри циклов. Они печально известны тем, что вызывают замедления, особенно когда в таблице запрашивается более нескольких сотен записей.
Другой пример: у вас есть несколько вызовов AJAX в быстрой последовательности, и вы используете обработчик сеанса PHP по умолчанию (плоские файлы). Это может привести к значительному увеличению времени загрузки, поскольку операции ввода-вывода блокируются. Это означает, что он может обрабатывать только один запрос, который использует сеанс за раз, хотя AJAX по своей природе асинхронный.
Лучший способ борьбы с этим — использовать / писать собственный обработчик сеансов, который использует базу данных для хранения сеансов. Просто убедитесь, что вы не насыщаете лимит соединения с БД.
В первую очередь, хотя: получить себе правильный профилировщик. 😉
Других решений пока нет …