Solución:
Como probablemente sepa, Xdebug eliminó el soporte de creación de perfiles de memoria desde la versión 2. *. Busque la cadena “funciones eliminadas” aquí: http://www.xdebug.org/updates.php
Funciones eliminadas
Se eliminó la compatibilidad con la creación de perfiles de memoria, ya que no funcionaba correctamente.
Así que probé otra herramienta y funcionó bien para mí.
https://github.com/arnaud-lb/php-memory-profiler
Esto es lo que hice en mi servidor Ubuntu para habilitarlo:
sudo apt-get install libjudy-dev libjudydebian1
sudo pecl install memprof
echo "extension=memprof.so" > /etc/php5/mods-available/memprof.ini
sudo php5enmod memprof
service apache2 restart
Y luego en mi código:
<?php
memprof_enable();
// do your stuff
memprof_dump_callgrind(fopen("/tmp/callgrind.out", "w"));
Finalmente abra el callgrind.out
archivo con KCachegrind
Usando Google gperftools (¡recomendado!)
Primero que nada instale el Google gperftools descargando el último paquete aquí: https://code.google.com/p/gperftools/
Entonces, como siempre:
sudo apt-get update
sudo apt-get install libunwind-dev -y
./configure
make
make install
Ahora en tu código:
memprof_enable();
// do your magic
memprof_dump_pprof(fopen("/tmp/profile.heap", "w"));
Luego abre tu terminal y lanza:
pprof --web /tmp/profile.heap
pprof creará una nueva ventana en su sesión de navegador existente con algo como se muestra a continuación:
Xhprof + Xhgui (el mejor en mi opinión para perfilar tanto la CPU como la memoria)
Con Xhprof y Xhgui también puede perfilar el uso de la CPU o solo el uso de la memoria si ese es su problema en este momento. Es una solución muy completa, le brinda control total y los registros se pueden escribir tanto en mongo como en el sistema de archivos.
Para obtener más detalles, consulte mi respuesta aquí.
Fuego negro
Blackfire es un generador de perfiles PHP de SensioLabs, los chicos de Symfony2 https://blackfire.io/
Si usa puphpet para configurar su máquina virtual, le alegrará saber que es compatible 😉
Me encontré con el mismo problema recientemente, desafortunadamente no pude encontrar ninguna herramienta específica.
Pero algo que ayudó fue generar la traza xdebug en formato legible por humanos con mem deltas habilitadas (una configuración INI, xdebug.show_mem_deltas o algo, creo?). Luego ejecute sort (si está en * nix) en la salida:
sort -bgrk 3 -o sorted.txt mytracefile.xt
Eso se ordena en la tercera columna, las mem deltas. También puede ordenar en la segunda columna, en cuyo caso puede encontrar la línea en la que su aplicación usa la mayor cantidad de memoria en total.
Por supuesto, esto no puede detectar cuándo el uso de memoria de un objeto solo aumenta en pequeños incrementos pero termina usando mucha memoria en general. Tengo un método bastante tonto que intenta hacer esto usando una combinación de iteración y serialización de objetos. Probablemente no equivale exactamente al uso de la memoria, pero con suerte da una idea de dónde empezar a buscar. Tenga en cuenta que consumirá memoria en sí mismo y tampoco se ha probado exhaustivamente, por lo que el comprador debe tener cuidado:
function analyzeMem($obj, $deep=false)
{
if (!is_scalar($obj))
{
$usage = array('Total'=>strlen(serialize($obj)));
while (list($prop, $propVal) = each($obj))
{
if ($deep && (is_object($propVal) || is_array($propVal)))
{
$usage['Children'][$prop] = analyzeMem($propVal);
}
else
{
$usage['Children'][$prop] = strlen(serialize($propVal));
}
}
return $usage;
}
else
{
return strlen(serialize($obj));
}
}
print_r(analyzeMem(get_defined_vars()));
Además, un colega acaba de sugerir este método (aplaude a Dennis 😉 Esto oculta los pasos que están por debajo de 2 niveles de sangría, puede ver con bastante facilidad los puntos en los que el uso general de la memoria aumenta y puede reducir las cosas aumentando la sangría:
egrep '[0-9]+ ( ){1,2}-> ' mytracefile.xt
En http://www.xdebug.org/updates.php para Xdebug 2.0.4 escriben en la sección “funciones eliminadas”: “… Se eliminó la compatibilidad con la creación de perfiles de memoria porque no funcionaba correctamente …”. Por lo tanto, xdebug no será una opción.