La forma más sencilla de perfilar un script PHP
¿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.
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
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(" %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
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).