Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > полный стек вызовов


Автор: bars80080 6.6.2017, 12:57
Добрый день, озаботился в последнее время отладкой.

суть ситуации:

есть крупный самописный (не на CMS) проект на php, который весь и за год не переберёшь. написан чрезвычайно разношёрстно и в полном беспорядке. как следствие, изрядно тормозит.
есть желание выявить узлы, требующие оптимизации.

если б речь касалась только работы с БД, то тут как раз проблем нет, так как всё идёт через пару классов, выявить объём запросов труда не составит. но как быть с многочисленными вызовами функций и методов, а также с накоплением в памяти большого объёма данных на одном процессе?

к примеру, знаю одно место, где происходит создание объекта в цикле. причём объект вообще-то при работе с ним ресурсозатратен. выбирает большие массивы данных из БД. но он же их в себе потом и хранит, так что вынос его за цикл и изменение методики его использования существенно облегчит нагрузку на сервер.
как допустим выловить именно такой момент? выявить количество создаваемых объектов с одного класса или выявить количество вызовов одного и того же метода?
причём, заранее не зная какой класс отлаживать.

конечно, сбор логгируемой информации может сам стать весьма затратным процессом как по времени, так и по огромным сохраняемым логам. но это как раз не мешает, если суметь запускать логгирование избирательно, по какой-нибудь отмашке в коде php. назначаешь логгирование только на определённых тестовых пользователей и никто кроме них не страдает.

сейчас смотрю xdebug и monolog, но пока не вижу чем они могут мне помочь. первый вроде как требуется устанавливать железно и запускается для всего проекта сразу, что никак нельзя допустить (загнёмся). надеюсь, ошибаюсь. второй вроде как ловит только ошибки, а нужно выявить затратные функции и многочисленные вызовы.

было бы прикольно, к примеру, если бы в php существовала предустановленный метод вроде set_error_handler, который позволяет все ошибки пропускать через свою функцию, но только чтобы вызывалась на запуск любой функции и метода без необходимости дописать его в 100 тысяч методов.


в общем, вопрос:
на что бы вы посоветовали обратить внимание?

Автор: Vardoulacha 6.6.2017, 13:54
Для таких задач есть xhprof, легкий аналог xdebug можно запускать (мы такое делали) прямо на продакшене, ничего не загнется.

Но есть минус, он не работает для версии PHP 7 ((

Автор: bars80080 6.6.2017, 18:13
окей, спасибо. почитаем

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)