Профиль медленные страницы PHP в производстве


Есть ли способ профилирования только медленных PHP страниц на рабочем сервере?

В данный момент мы записываем медленные страницы в текстовый файл, но без дополнительной информации трудно сказать, почему они медленные (не всегда медленные).

Я уже использовал профилировщик Xdebug раньше, но я действительно не хочу включать его на наших производственных серверах, так как мы, скорее всего, будем получать 100 запросов в секунду. Я также использовал платформу Zend, но я действительно не хочу установите это снова.

Author: Peter Mortensen, 2010-10-28

5 answers

Вы можете изменить журналы сервера Apache/HTTP, чтобы записывать время, затраченное на обслуживание каждого запроса. Следуйте этому руководству , например. Затем вы можете собрать данные о том, сколько времени занимает каждый запрос, определить медленные страницы/запросы и использовать xdebug или webgrind для дальнейшего анализа причин.

Легко и без больших затрат на ваш рабочий сервер.

 3
Author: Ghostpsalm, 2010-11-25 01:27:31

Вы могли бы написать, что операторы таймера являются частью медленных страниц, чтобы сузить их. Затем, как только некоторые данные будут собраны, промойте и повторите.

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/

Это может удовлетворить ваши потребности

 2
Author: Petah, 2010-10-28 04:13:12

Я бы с подозрением отнесся к совершенно новой библиотеке для производственного сервера. Когда я отлаживаю, мне нравится использовать директивы *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
   */
}
 0
Author: DrPerdix, 2010-10-28 12:21:10

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

Я надеюсь, что это поможет вам

 0
Author: Jerome WAGNER, 2010-11-22 23:14:49

Я знаю, что это не лучшее решение, но...

Вы можете создать вспомогательный класс для регистрации каждого вашего процесса, а также времени начала и окончания. Я знаю, что вы уже делаете это для всего процесса, но для каждого запуска и завершения функции вы можете добавить функцию "Профилировщик::logtime()";

 0
Author: Dave, 2010-11-23 11:18:28