Depuración remota con Xdebug de un proyecto PHP/Drupal

12/05/2015
Depuración remota con Xdebug de un proyecto PHP/Drupal

En los desarrollos con PHP, para poder detectar posibles errores o las causas de un comportamiento inadecuado de alguna funcionalidad, la mayoría de las veces se hace necesario hacer un depurado exhaustivo del código, que siga la traza de valores de las variables durante toda la ejecución. Concretamente para el caso  de desarrollos con Drupal es muy frecuente el uso del módulo Devel; aunque este módulo es muy útil para ver el valor de las variables y por otras funcionalidades, a veces se queda corto. Para realizar esta tarea podemos usar una extensión de PHP llamada Xdebug, junto con algún IDE de desarrollo, configurado todo adecuadamente.

Cuando estamos desarrollando en un entorno local, con el proyecto PHP y el servidor web en la misma máquina, usar Xdebug no supone mayor inconveniente, sólo hay que instalarlo, configurar el navegador como veremos más adelante y listo. El problema surge cuando queremos depurar código de una aplicación que se ejecuta en una máquina remota, en cuyo caso habrá que tener en cuenta más factores. Así, los pasos para realizar la configuración son los siguientes:

Requisitos de los entornos

  • Xdebug en máquina remota

  • PHPStorm en máquina local

  • Chrome + extensión Xdebug helper en local

Configurar entorno remoto

Para poder configurar el entorno remoto, obviamente tendremos que tener acceso a la máquina remota y permisos para poder instalar aplicaciones y modificar ficheros de configuración. Sabido esto, los pasos son los siguientes:

  • Instalar Xdebug (PHP 5.4)

- Ubuntu / Debian:

sudo apt-get install php5-xdebug

- CentOS / Fedora:

sudo yum install php54w-pecl-xdebug*

* Paquetes para otras versiones de PHP en CentOS/Fedora: https://webtatic.com/packages/

 

  • Configurar Xdebug

- Ubuntu / Debian: /etc/php5/conf.d/xdebug.ini o /etc/php5/conf.d/20-xdebug.ini (dependiendo de la versión)

- CentOS / Fedora: /etc/php.d/xdebug.ini o también en /etc/php.ini (dependiendo de la versión)

zend_extension=/ruta/a/librerías/xdebug.so*
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host= <dirección_ip>**
xdebug.remote_port=9000***

    *    Ruta donde esté la librería xdebug.so

    **  Este parámetro de configuración es quizá el más importante, y se puede configurar de dos formas:

- Si únicamente yo voy a depurar remotamente y la ip de mi máquina local es estática:

xdebug.remote_host= <ip_maquina_local>

Ej: xdebug.remote_host=10.0.0.15

- Si más usuarios van a depurar en la máquina remota o la ip de mi máquina local es dinámica:

xdebug.remote_host=localhost

En este caso siempre que queramos depurar tendremos que tener abierto un túnel SSH con la máquina remota, ejecutando el siguiente comando desde la máquina local: 

ssh -R puerto:localhost:puerto usuario@maquina

       Ej: ssh -R 9000:localhost:9000 drupal@10.10.3.50


    *** Puerto para establecer la conexión, normalmente el 9000. Comprobar que está libre con el comando: nmap localhost -p 9000 | grep -i tcp. Si no está libre, usar otro (y configurar ese mismo puerto en las opciones de debug del IDE).

 

  • Reiniciar Apache

- Ubuntu / Debian:

sudo /etc/init.d/apache2 restart

- CentOS / Fedora:

sudo /etc/init.d/httpd restart

 

Configurar entorno local

Para configurar nuestro entorno local sólo necesitamos tener el código fuente, un navegador y un IDE. En nuestro caso el IDE es PHPStorm y el navegador es Chrome, pero también hay plugins de Xdebug para Firefox, y podemos usar NetBeans, etc. Así pues, los pasos son los siguientes:

  • Montar el proyecto remoto en la máquina local, bien sea copiando los archivos por ssh:
sshfs usuario@host_remoto:/var/www/proyecto /tmp/proyecto

o con Git si lo tenemos en Github:

git clone git@github.com:/usuario/proyecto.git

 

  • Instalar Google Chrome y la extensión Xdebug helper

https://www.google.com/chrome/browser/desktop/index.html

https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc

 

  • Configurar la extensión Xdebug helper como sigue:

- IDE Key: PHPStorm

- Domain filter: <url_del_sitio>

Configurar extensión Xdebug helper

 

  • Acceder al sitio y habilitar Debug

Habilitar escucha Xdebug helper

 

  • Abrir proyecto en PHPStorm y habilitar la escucha del puerto de debug

Habilitar puerto de escucha Xdebug en PHPStorm

Deshabilitar puerto de escucha Xdebug en PHPStorm

 

  • Una vez lo tengamos todo configurado, sólo nos queda colocar los puntos de interrupción en nuestro código y ejecutar la aplicación web desde el navegador

 

Configuración específica para depurar en un contenedor LXC en mi máquina local

Cuando queremos depurar un proyecto que está alojado en un contenedor LXC, a todos los efectos se debe aplicar la misma configuración (entendiendo que el contenedor LXC es la máquina remota), pero con esta diferencia en el archivo de configuración de Xdebug que vimos antes:

xdebug.remote_host= <ip_de_virbr0> o <ip_de_lxcbr0>*


* Dirección IP de la interfaz virbr0 o lxcbr0 de la máquina local (usar el comando ifconfig en la máquina local para saberla).

 

Referencias