开发者

Profile slow PHP pages in production

Is there a way of profiling only slow PHP pages on a production server?

At the moment we're logging slow pages to a text file, but without more information it's hard to say why they're slow (not consistently slow).

I've used the Xdebug profiler before, but I really don't want to enable this on our production servers as we are likely to get 100's o开发者_运维知识库f requests per second. I've also used Zend Platform, but I don't really want to install that again.


You might alter your Apache/HTTP Server logs to record the time spent serving each request. Follow this guide for example. Then you can gather data for how long each request takes, identify the slow pages/requests and use XDebug or WebGrind to further analyse the causes.

Easy, and no great drain on your production server.


You could write timer statements are parts of the slow pages to narrow it down. Then once some data is built up, rinse and repeat.

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);
}

Also check out this: http://particletree.com/features/php-quick-profiler/

It might suit your needs


I'd be leery of of a whole new library for a production server. When I'm debugging I like to use the *auto_prepend_file* and *auto_append_file* directives in php.ini. You could easily do as suggested above with this method and get a very exact time for each page load.

If you are worried about only slow load pages measured in seconds, here is a quick and dirty solution that subtracts the server request time from approximate finish time in an auto-appended file. You can then store the result in a db or flat file.

eg in 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
   */
}


I suggest you to take a look at the webgrind project. You can activate profiling per-query, which would maybe allow you to get profiling data from your production server without a huge performance impact.

I hope this will help you


I know this is not the best solution, but...

You can create a helper class to log every process you have, along with start and end time. I know you do it already for whole process, but for each function start and end you can add a "Profiler::logtime(FUNC)";

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜