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.

Subscribe to our newsletter to get the latest Roots updates, along with occasional tips on building better WordPress sites.

Looking for WordPress plugin recommendations, the newest modern WordPress projects, and general web development tips and articles?

Follow @rootswp on Twitter