2012-04-18 22 views
5

Quiero hacer una página de estado para mi aplicación usando symfony2 donde quiero imprimir el tiempo de ejecución (junto con otros datos) de la solicitud particular. No pude encontrar de todos modos para hacer esto.symfony2 - Obtener tiempo de ejecución

sé que puedo realizar un seguimiento del tiempo de ejecución de una parte de código con:

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

Pero por razones obvias no puedo colocarlo en el controlador, ya que todo el sistema de arranque podría no ser rastreado. Además, no se incluirá la plantilla.

¿Hay alguna forma de acercarse lo más posible al tiempo de ejecución total del script?

+0

¿Qué ocurre con el sistema de creación de perfiles integrado? Tendrá características aún más impresionantes en 2.1, como un gráfico de tiempo detallado, algo similar a los gráficos de firebug y webkit. – gilden

+0

Me gustaría hacer esto en el entorno de producción en una página especial. En este momento no tengo idea de cómo funciona el generador de perfiles. ¿Puedo simplemente "activarlo" de alguna manera cuando sirvo una acción y no tengo impacto en el rendimiento en todas las demás acciones? – Sgoettschkes

+0

Para crear perfiles en un servidor de producción, es probable que desee examinar xhprof ... – greg0ire

Respuesta

8

Encontré una manera que creo que está bien para nuestro caso de uso. He creado un nuevo performance.php archivo en la carpeta web que se parece a esto:

<?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'; 

También registró una ramita de extensión que utiliza el mundial y calcula el tiempo transcurrido:

<?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"; 
    } 

} 

Cuando queremos Para hacer algunas mediciones de rendimiento, simplemente podemos usar performance.php. La plantilla llama a la función y luego puede mostrar el tiempo de ejecución:

{{ performance_exectime() }} 

Se da salida a 0 si la hora de inicio no está establecido (por ejemplo, cuando se utiliza el app.php normal), por lo que es seguro de usar en cualquier caso . Por otro lado, si alguien decide usar performance.php como punto de entrada, no debería romper nada ya que solo una variable global es diferente.

+0

¡Esta es una gran idea! (Considere convertir esto en una entrada wiki). –

1

A partir de PHP 5.4 podemos hacer microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']

Como utilizar en Symfony2:

src/AppBundle/Twig/AppExtension.php

<?php 

namespace AppBundle\Twig; 

class AppExtension extends \Twig_Extension 
{ 
    public function getFunctions() 
    { 
     return [ 
      new \Twig_SimpleFunction('request_time', [$this, 'requestTime'], ['is_safe' => ['html']]), 
     ]; 
    } 

    public function requestTime($decimals = 3) 
    { 
     return number_format(microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'], $decimals); 
    } 

    public function getName() 
    { 
     return 'app_extension'; 
    } 
} 

a la vista:

<footer class="footer"> 
    <div class="container"> 
     <p class="text-muted">{{ request_time() }}s</p> 
    </div> 
</footer> 

en app/config/services.yml:

services: 
    app.twig_extension: 
     class: AppBundle\Twig\AppExtension 
     public: false 
     tags: 
      - { name: twig.extension } 
Cuestiones relacionadas