Профиль медленные страницы PHP в производстве
Есть ли способ профилирования только медленных PHP страниц на рабочем сервере?
В данный момент мы записываем медленные страницы в текстовый файл, но без дополнительной информации трудно сказать, почему они медленные (не всегда медленные).
Я уже использовал профилировщик Xdebug раньше, но я действительно не хочу включать его на наших производственных серверах, так как мы, скорее всего, будем получать 100 запросов в секунду. Я также использовал платформу Zend, но я действительно не хочу установите это снова.
5 answers
Вы можете изменить журналы сервера Apache/HTTP, чтобы записывать время, затраченное на обслуживание каждого запроса. Следуйте этому руководству , например. Затем вы можете собрать данные о том, сколько времени занимает каждый запрос, определить медленные страницы/запросы и использовать 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. Вы можете легко сделать, как было предложено выше, с помощью этого метода и получить очень точное время для каждой загрузки страницы.
Если вас беспокоит только медленная загрузка страниц, измеряемая в секундах, вот быстрое и грязное решение, которое вычитает время запроса сервера из приблизительного времени завершения в автоматически добавляемом файле. Ты можешь затем сохраните результат в БД или неструктурированном файле.
Например, в 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. Вы можете активировать профилирование для каждого запроса, что, возможно, позволит вам получать данные профилирования с вашего рабочего сервера без значительного снижения производительности.
Я надеюсь, что это поможет вам
Я знаю, что это не лучшее решение, но...
Вы можете создать вспомогательный класс для регистрации каждого вашего процесса, а также времени начала и окончания. Я знаю, что вы уже делаете это для всего процесса, но для каждого запуска и завершения функции вы можете добавить функцию "Профилировщик::logtime()";