Como Instalar Herramientas Para Depurar y Perfilar Código PHP.

Recientemente tuve la necesidad de optimizar el consumo de CPU de un sitio web construido con Drupal y desplegado sobre un stack LAMP. Para esto necesité configurar mi servidor de desarrollo para que soportara depuración y perfilación de scripts PHP. Hasta ese momento había usado MAMP como mi servidor de desarrollo pero no me gustaba el hecho de no conocer los detalles de su instalación. Tomé esto como oportunidad de hacer una instalación y configuración manual de mi servidor local. Estas son las instrucciones para replicar la instalación.
Un requerimiento adicional es poder cambiar fácilmente entre versiones de PHP (5.2 y 5.3).

Prerequisitos

1. Instalar MySQL, Apache y PHP 5.3

Para instalar y hacer la configuración inicial de MySQL, ingrese los siguientes comandos en la terminal:

1
2
3
4
$ sudo port install mysql5-server
$ sudo -u mysql mysql_install_db5
$ sudo /opt/local/etc/LaunchDaemons/org.macports.mysql5/mysql5.wrapper start
$ sudo /opt/local/bin/mysql_secure_installation5

Apache y PHP se pueden instalar así:

1
2
3
4
5
$ sudo port install php5 +pear +apache2
$ sudo port install php5-mysql -mysqlnd +mysql5
$ cd /opt/local/apache2/modules
$ sudo /opt/local/apache2/bin/apxs -a -e -n "php5" libphp5.so
$ sudo cp /opt/local/etc/php5/php.ini-development /opt/local/etc/php5/php.ini

Para que Apache procese los archivos con extension.php usando el módulo de PHP, agregue las siguientes lineas al archivo httpd.conf que se encuentra en /opt/local/apache2/conf/httpd.conf

1
2
3
4
5
# Agregue dentro de la sección IfModule mime_module:
AddType application/x-httpd-php .php .phtml

# Agregue dentro de la sección IfModule dir_module:
DirectoryIndex index.html index.php

Se debe configurar la zona horaria para que PHP no emita una advertencia acerca de la utilización de la zona horaria del sistema. En el archivo php.ini que está localizado en /opt/local/etc/php5/php.ini agregue la siguiente línea bajo la sección [Date]

1
date.timezone = America/Bogota

Si quiere crear vhosts por fuera de su directorio principal de Apache, modifique la siguiente sección en su archivo httpd.conf:

1
2
3
4
5
6
7
8
9
User rafael
Group staff

<Directory />
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

Para iniciar y detener los servidores, puede utilizar los siguientes comandos:

1
2
3
4
5
6
7
8
9
10
11
#Iniciar MySQL:
sudo /opt/local/etc/LaunchDaemons/org.macports.mysql5/mysql5.wrapper start

#Detener MySQL:
sudo /opt/local/etc/LaunchDaemons/org.macports.mysql5/mysql5.wrapper stop

#Iniciar Apache:
sudo /opt/local/apache2/bin/apachectl start

#Detener Apache:
sudo /opt/local/apache2/bin/apachectl stop

2. Instalar Xdebug

Asegúrese de tener activada la versión 5.3 de PHP e instale la extensión Xdebug:

1
sudo port install php5-xdebug

Agregue las siguientes líneas a su archivo php.ini:

1
2
3
4
5
6
7
8
9
[XDebug]
xdebug.remote_enable=1
xdebug.remote_host=localhost
xdebug.remote_port=9000
xdebug.remote_autostart=1

xdebug.profiler_enable=1
xdebug.profiler_output_dir="/opt/local/apache2/logs/profiler"
xdebug.profiler_output_name=cachegrind.out.%t.%s

3. Instalar PHP 5.2

1
2
sudo port deactivate php5
sudo port install php52 +mysql5 +apache2 +pear

Para que xebug funcione con PHP 5.2, debe utilizar un binario de la extensión Xdebug que esté compilado para funcionar con PHP 5.2. La gente de ActiveState tiene una colección de binarios de Xdebug.

Baje el paquete PHP Remote Debugging, descomprimalo y copielo a /opt/local/lib/php/extensions/no-debug-non-zts-20090626/xdebug.5.2.so observe que se cambió el nombre a xdebug.5.2.so. Para identificar las dos versiones del binario, renombre el archivo xdebug.so que se instaló originalmente a xdebug.5.3.so.

Los siguientes scripts se encargarán de escoger la versión adecuada del archivo según la versión de PHP que quiera activar:

4. Crear scripts para activar la versión deseada de PHP

Ponga el siguiente código en un archivo con permisos de ejecución y utilícelo para habilitar PHP 5.2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#! /bin/bash
sudo /opt/local/apache2/bin/apachectl stop

sudo rm /opt/local/lib/php/extensions/no-debug-non-zts-20090626/xdebug.so
sudo cp /opt/local/lib/php/extensions/no-debug-non-zts-20090626/xdebug.5.2.so /opt/local/lib/php/extensions/no-debug-non-zts-20090626/xdebug.so

sudo port deactivate php5-gd
sudo port deactivate php5-iconv
sudo port deactivate php5-mbstring

sudo port deactivate php5
sudo port activate php52

sudo /opt/local/apache2/bin/apachectl start

Haga lo mismo con el siguiente código y ejecútelo para activar la versión 5.3 de PHP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#! /bin/sh
sudo /opt/local/apache2/bin/apachectl stop

sudo rm /opt/local/lib/php/extensions/no-debug-non-zts-20090626/xdebug.so
sudo cp /opt/local/lib/php/extensions/no-debug-non-zts-20090626/xdebug.5.3.so /opt/local/lib/php/extensions/no-debug-non-zts-20090626/xdebug.so

sudo port deactivate php52
sudo port activate php5

sudo port activate php5-gd
sudo port activate php5-iconv
sudo port activate php5-mbstring

sudo /opt/local/apache2/bin/apachectl start

5. Instalar Un Depurador Gráfico

Existen varias opciones de depuradores gráficos para utilizar con Xdebug: Eclipse PDT, Active State Komodo, Zend Studio entre otros.

Mi elección fué MacGDBp por ser una aplicación de código abierto, tener una interfaz minimalista y ser una aplicación nativa de MacOS. Las otras opciones que evalué tienen licencias comerciales, están implementadas en java que no es muy rápido en MacOS o son un IDE completo con decenas de características que no necesito.

Después de descargar e instalar MacGDBp solo necesita lanzar la aplicación y hacer una petición a un script php en su servidor local. Por defecto, MacGDBp está configurado para detener la ejecución en la primera línea del script. La interfaz es lo suficientemente simple para experimentar y entender su funcionamiento:

MacGDBp

6. Instalar Un Analizador de Archivos del Perfilador

Con la configuración de Xdebug que propuse, Xdebug creará un archivo de volcado del perfilador en /opt/local/apache2/logs/profiler por cada petición que se haga a un script PHP en el servidor local. Estos archivos son difíciles de leer sin la ayuda de una aplicación de visualización pero contienen muchísima información que permite encontrar y optimizar cuellos de botella en la ejecución del código.

Los analizadores que evalué fueron MacCallGrind, WebGrind y kCachegrind.

MacCallGrind es una excelente opción por su interface pulida y minimalista pero tiene un precio alto de $150 USD.

WebGrind y kCacheGrind pueden ser utilizados de forma complementaria ya que ambos presentan opciones de visualización diferentes:

WebGrind es un script de PHP que corre sobre cualquier servidor web con PHP instalado, la manera mas fácil de usarlo es descargar la última versión estable, descomprimirla y ponerla en su directorio público de Apache. Luego abra un navegador y vaya a http://localhost/webgrind. Desde la interface web puede abrir los archivos de volcado del perfilador.

kCacheGrind es una aplicación de KDE y puede ser compilada para MacOS con el siguiente comando. La instalación tardó aproximadamente 4 horas en mi maquina.

1
sudo port install graphviz kcachegrind

Las fuentes que KDE utiliza por defecto no son muy legibles en el entorno de MacOS. Para corregir esto, agregue las siguientes líneas al archivo /Users/sunombre/.kde/share/config

1
2
3
4
5
6
7
8
9
[General]
fixed=Monaco,9,-1,5,50,0,0,0,0,0
font=Geneva,9,-1,5,50,0,0,0,0,0
menuFont=Geneva,9,-1,5,50,0,0,0,0,0
taskbarFont=Geneva,8,-1,5,50,0,0,0,0,0
toolBarFont=Geneva,8,-1,5,50,0,0,0,0,0

[WM]
activeFont=Geneva,9,-1,5,50,0,0,0,0,0

Puede lanzar la aplicación con el comando:

1
sudo kcachegrind

Espero que estas instrucciones le sean útiles. Sus comentarios son bienvenidos!

5 thoughts on “Como Instalar Herramientas Para Depurar y Perfilar Código PHP.

  1. Un comentario adicional:

    Para trabajar mas comodamente con Xdebug desde su editor de texto favorito (el mio es TextMate), agregue la siguiente línea en su php.ini para que Xdebug cree mensajes de error con enlaces que abran el archivo donde se encuentra el error utilizando TextMate:

    xdebug.file_link_format = "txmt://open?url=file://%f&line=%l"

    Adicionalmente, puede usar la siguiente función de php en su código para establecer puntos de parada en xdebug:

    xdebug_break();
  2. Rafa, excelente !!!!!!
    se necesita sacar un buen tiempo, para este tipo de instalación, la realizaré !

  3. Rafa brew ya tiene la manera de instalar "qcachegrind.app"
    brew update
    brew install qt
    brew install graphviz
    sudo ln -s /usr/local/bin/dot /usr/bin/dot
    git clone git://anongit.kde.org/kcachegrind
    cd kcachegrind
    qmake -spec 'macx-g++'
    make
    mv ./kcachegrind/qcachegrind.app /Applications/qcachegrind.app

    y listo tenemos una App que se abrir desde el Finder
    o de la terminal
    open /Applications/qcachegrind.app

  4. Pretty Nice post. Me tropecé con su blog y quería decir que he Verdaderamente disfrutamos Navegar alrededor de su blog. En todo caso yo? Ll ser suscribirse a su feed y espero que escribir de nuevo pronto!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>