Timing WordPress Requests

Sometimes when doing performance testing, you just want to do a quick test without setting up a full benchmarking test suite. WordPress and PHP offer a few tools for us to use.

WP Timers

WP has 2 little known functions available for us: timer_start and timer_stop.

timer_start (source) just sets a global variable $timestart to PHP's microtime (docs). microtime just returns the current Unix timestamp with microseconds, and in WP's case, as a float.

timer_stop (source) also calls microtime and sets it to the global $timeend. It then returns $timeend - $timestart to get the total time (in seconds) elapsed between the 2 calls.

You can wrap any code you want between these two functions to get the time elapsed. But WP conveniently includes timer_start early on in their bootstrapping process in wp-settings.php (source). This means that you can just drop a timer_stop() call into your theme to get the total elapsed time of the request up until that point.

Example in your functions.php:

$time_elapsed = timer_stop();

Or if you just want to echo the time, pass a boolean as the first parameter:

timer_stop(true);

Note that although WP always calls timer_start which sets the global variable $timestart, calling it again yourself will overwrite $timestart to the microtime when you called it.

PHP Request Time

If you want to get a more precise measure of how long an entire request takes, you shouldn't rely on timer_start and timer_stop. The main reason is that although WP tries to call timer_start early on, it's still not early enough. Take a look at wp-settings again and notice how much is happening before the timer starts. And wp-settings.php isn't even the first WP file loaded either.

You're probably familiar with superglobal $_SERVER (docs). $_SERVER['REQUEST_TIME'] is actually the timestamp of the start of the request. Available since PHP 5.1.0, this is an integer. $_SERVER['REQUEST_TIME_FLOAT'] is available since PHP 5.4.0 and is the same timestamp but as a float.

This timestamp gives us a much more accurate time to work with as the beginning of the request. You can use it like this:

$time_elapsed = microtime() - $_SERVER['REQUEST_TIME']; // PHP 5.1.0
$time_elapsed = microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']; // PHP 5.4.0

Total Request Time

If you want to know the total elapsed time (spent in PHP) of a request, you could try and do the above with that calculation done as the last thing in your page/theme. But that can actually be a little messy.

It would probably involve placing that code as the last thing in your footer template for example. Fortunately there's a foolproof way to know your code will run at the end of the request and keep your code in functions.php (or anywhere other than a template).

PHP provides a way to register a function to be run when PHP shuts down. The function is conveniently called register_shutdown_function (docs) and it looks like this:

function time_elapsed() {
  $time_elapsed = microtime() - $_SERVER['REQUEST_TIME']; // PHP 5.1.0
  echo $time_elapsed, PHP_EOL;
}

register_shutdown_function('time_elapsed');

WordPress actually has a shutdown action (docs) that you can hook into as well:

function time_elapsed() {
  $time_elapsed = microtime() - $_SERVER['REQUEST_TIME'];
  echo $time_elapsed, PHP_EOL;
}

add_action('shutdown', 'time_elapsed');

With either of these methods, you'll get as close as you can can get to the total request time.

Happy timing.

Get our latest updates & occasional tips on building better WordPress sites

Follow @rootswp on Twitter