# 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](https://github.com/WordPress/WordPress/blob/master/wp-includes/load.php#L184-L196)) just sets a global variable `$timestart` to PHP's `microtime` ([docs](http://php.net/manual/en/function.microtime.php)). `microtime` just returns the current Unix timestamp with microseconds, and in WP's case, as a `float`.

`timer_stop` ([source](https://github.com/WordPress/WordPress/blob/master/wp-includes/load.php#L198-L230)) 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](https://github.com/WordPress/WordPress/blob/master/wp-settings.php#L51)). 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](https://github.com/WordPress/WordPress/blob/master/wp-settings.php#L51) 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](http://php.net/manual/en/reserved.variables.server.php)). `$_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](http://php.net/manual/en/function.register-shutdown-function.php)) 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](http://codex.wordpress.org/Plugin_API/Action_Reference/shutdown)) 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.