Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

symfony2 - Get execution time

I want to make a status page for my application using symfony2 where I want to print the execution time (along with other data) of the particular request. I could not find anyway to do this.

I know that I can track the execution time of a code part with:

$starttime = microtime();
// do something
$duration = microtime() - $starttime;

But for obvious reason I cannot place it in the controller, as the whole bootstrap would be not tracked. Also rendering the template would not be included.

Is there any way to get as near as possible to the total execution time of the script?

like image 696
Sgoettschkes Avatar asked Apr 18 '12 14:04

Sgoettschkes


1 Answers

I found a way which I think is ok for our use case. I created a new file performance.php in the web folder which looks like this:

<?php
/**
 * This file is only used for doing realtime performance measurement
 * Right now only the microtime is calculated, but in the future the
 * xhproof module could be used: http://de2.php.net/manual/en/book.xhprof.php
 *
 * MAKE SURE TO NOT USE THIS FILE IN PRODUCTION FOR OTHER STUFF THAN REAL TIME
 * PERFORMANCE MEASUREMENT
 */

$GLOBALS['PerformanceTwigExtensionMicrotime'] = microtime(true);

require_once __DIR__.'/app.php';

I also registered a twig extension which uses the global and calculates the elapsed time:

<?php

namespace Acme\DemoBundle\Extension;

class PerformanceTwigExtension extends \Twig_Extension {

    public function getFunctions() {
        return array(
            'performance_exectime' => new \Twig_Function_Method($this, 'getExecTime')
        );
    }

    public function getExecTime() {
        if (!isset($GLOBALS['PerformanceTwigExtensionMicrotime'])) {
            return 0;
        }

        $durationInMilliseconds = (microtime(true) - $GLOBALS['PerformanceTwigExtensionMicrotime']) * 1000;
        return number_format($durationInMilliseconds, 3, '.', '');
    }

    public function getName() {
        return "performance_extension";
    }

}

When we want to do some performance measurements, we can simply use performance.php. The template calls the function and can then display the execution time:

{{ performance_exectime() }}

It outputs 0 if the start time is not set (e.g. when the normal app.php is used), so it's safe to use in any case. On the other hand, if someone decides to use performance.php as an entry point, it shouldn't break anything as only one global variable is different.

like image 173
Sgoettschkes Avatar answered Sep 25 '22 05:09

Sgoettschkes