Есть ли способ профилирования только медленных страниц PHP на производственном сервере?
На данный момент мы записываем медленные страницы в текстовый файл, но без дополнительной информации трудно сказать, почему они медленные (не постоянно медленные).
Раньше я использовал профайлер Xdebug , но я действительно не хочу включать это на наших производственных серверах, так как мы можем получить 100 запросов в секунду. Я также использовал платформу Zend , но я не хочу ее снова устанавливать.
Вы можете изменить свои журналы Apache / HTTP Server для записи времени, затраченного на обслуживание каждого запроса. Следуйте этому руководству, например. Затем вы можете собирать данные о том, сколько времени занимает каждый запрос, идентифицировать медленные страницы / запросы и использовать XDebug или WebGrind для дальнейшего анализа причин.
Легко и без больших затрат на вашем производственном сервере.
Вы могли бы написать инструкции таймера, это части медленных страниц, чтобы сузить его. Затем, как только некоторые данные будут созданы, промойте и повторите.
define('START_TIME', microtime(true)); function timer() { static $last; $time_since_start = microtime(true) - START_TIME; $time_since_last = microtime(true) - $last; // Do something with $time vars $last = microtime(true); }
Также ознакомьтесь с этим: http://particletree.com/features/php-quick-profiler/
Это может удовлетворить ваши потребности
Я бы назвал новую библиотеку для производственного сервера. Когда я отлаживаю, мне нравится использовать директивы * auto_prepend_file * и * auto_append_file * в php.ini. Вы можете легко сделать, как было предложено выше, с помощью этого метода и получить очень точное время для каждой загрузки страницы.
Если вас беспокоят только медленные страницы загрузки, измеренные в секундах, вот быстрое и грязное решение, которое вычитает время запроса сервера из приблизительного времени окончания в файле с добавлением автоматически. Затем вы можете сохранить результат в файле db или flat.
например, в php.in
auto_append_file = [location]/my_timer.php
my_timer.php
define('TRIGGER_TIME_LOG','3'); // Minimum number of timer seconds to log page load $time = time() - $_SERVER['REQUEST_TIME']; // Page load time if($time >= TRIGGER_TIME_LOG) { /* * DO LOGGING TO DB OR FLAT FILE HERE */ }
Я предлагаю вам взглянуть на проект webgrind . Вы можете активировать профилирование для каждого запроса, что, возможно, позволит вам профилировать данные с вашего производственного сервера без огромного влияния на производительность.
Я надеюсь, что это поможет вам
Я знаю, что это не лучшее решение, но …
Вы можете создать вспомогательный класс для регистрации каждого процесса, который у вас есть, а также времени начала и окончания. Я знаю, что вы делаете это уже для всего процесса, но для каждой функции запуска и завершения вы можете добавить «Profiler :: logtime ( FUNC )»;