La forma más sencilla de perfilar un script PHP

Resuelto Mark Biek asked hace 54 años • 14 respuestas

¿Cuál es la forma más sencilla de crear un perfil de un script PHP?

Me encantaría agregar algo que me muestre un volcado de todas las llamadas a funciones y cuánto tiempo tardaron, pero también estoy de acuerdo con poner algo alrededor de funciones específicas.

Intenté experimentar con la función microtime :

$then = microtime();
myFunc();
$now = microtime();

echo sprintf("Elapsed:  %f", $now-$then);

pero eso a veces me da resultados negativos. Además, es un montón de problemas esparcir eso por todo mi código.

Mark Biek avatar Jan 01 '70 08:01 Mark Biek
Aceptado

Quieres xdebug, creo. Instálelo en el servidor, enciéndalo, bombee la salida a través de kcachegrind (para Linux) o wincachegrind (para Windows) y le mostrará algunos gráficos bonitos que detallan los tiempos exactos, los recuentos y el uso de memoria (pero podrá necesita otra extensión para eso).

Es genial, en serio :D

mercutio avatar Aug 21 '2008 20:08 mercutio

No se necesitan extensiones, simplemente use estas dos funciones para crear perfiles simples.

// Call this at each point of interest, passing a descriptive string
function prof_flag($str)
{
    global $prof_timing, $prof_names;
    $prof_timing[] = microtime(true);
    $prof_names[] = $str;
}

// Call this when you're done and want to see the results
function prof_print()
{
    global $prof_timing, $prof_names;
    $size = count($prof_timing);
    for($i=0;$i<$size - 1; $i++)
    {
        echo "<b>{$prof_names[$i]}</b><br>";
        echo sprintf("&nbsp;&nbsp;&nbsp;%f<br>", $prof_timing[$i+1]-$prof_timing[$i]);
    }
    echo "<b>{$prof_names[$size-1]}</b><br>";
}

Aquí hay un ejemplo, llamando a prof_flag() con una descripción en cada punto de control y a prof_print() al final:

prof_flag("Start");

   include '../lib/database.php';
   include '../lib/helper_func.php';

prof_flag("Connect to DB");

   connect_to_db();

prof_flag("Perform query");

   // Get all the data

   $select_query = "SELECT * FROM data_table";
   $result = mysql_query($select_query);

prof_flag("Retrieve data");

   $rows = array();
   $found_data=false;
   while($r = mysql_fetch_assoc($result))
   {
       $found_data=true;
       $rows[] = $r;
   }

prof_flag("Close DB");

   mysql_close();   //close database connection

prof_flag("Done");
prof_print();

La salida se ve así:

Iniciar
   0.004303
Conectarse a la BD
   0.003518
Realizar consulta
   0.000308
Recuperar datos
   0.000009
Cerrar BD
   0.000049
Hecho

TimH - Codidact avatar Mar 12 '2015 23:03 TimH - Codidact

La extensión PECL APD se utiliza de la siguiente manera:

<?php
apd_set_pprof_trace();

//rest of the script
?>

Luego, analice el archivo generado usando pprofp.

Salida de ejemplo:

Trace for /home/dan/testapd.php
Total Elapsed Time = 0.00
Total System Time  = 0.00
Total User Time    = 0.00


Real         User        System             secs/    cumm
%Time (excl/cumm)  (excl/cumm)  (excl/cumm) Calls    call    s/call  Memory Usage Name
--------------------------------------------------------------------------------------
100.0 0.00 0.00  0.00 0.00  0.00 0.00     1  0.0000   0.0009            0 main
56.9 0.00 0.00  0.00 0.00  0.00 0.00     1  0.0005   0.0005            0 apd_set_pprof_trace
28.0 0.00 0.00  0.00 0.00  0.00 0.00    10  0.0000   0.0000            0 preg_replace
14.3 0.00 0.00  0.00 0.00  0.00 0.00    10  0.0000   0.0000            0 str_replace

Advertencia: la última versión de APD data de 2004, la extensión ya no se mantiene y tiene varios problemas de compatibilidad (ver comentarios).

Vincent avatar Aug 21 '2008 21:08 Vincent