Depurando PHP
Hay muchas maneras de realizar depuración en aplicaciones PHP, y una de las más efectivas es utilizando un debugger. Una de las herramientas más potentes en la comunidad PHP es Xdebug.
¿Qué es Xdebug?
Xdebug permite lo siguiente:
- depurar y perfilar aplicaciones PHP y scripts
- depurar código en forma interactiva
- medir la performance de tu aplicación
- ver el estado de tu aplicación en un determinado momento
Xdebug te ofrece distintas formas de visibilidad en el interior de tu aplicación, como valores de variables en determinado momento, qué funciones están tardando más de la cuenta para ejecutarse, así como también que valores retornan ciertas funciones.
Te da la posibilidad de ir deteniéndote sobre la ejecución de tu aplicación función por función, o línea por línea si quisieras.
Instalación
Trellis viene configurado con Xdebug y listo para ser utilizado. Todo lo que hay que hacer es seleccionar un depurador compatible. Xdebug está diseñado para ser utilizado con un depurador DBGP-compatible. PHPStorm viene con el soporte en forma predeterminada Sublime Text, Visual Studio Code, y Vim tienen plugins disponibles.
Configuración
Las variables utilizadas en el rol roles/xdebug se correlacionan directamente con las opciones de configuración utilizadas por Xdebug. Por ejemplo, Xdebug cuenta con la opción xdebug.scream para deshabilitar la supresión de error PHP utilizando el símbolo @ antes de llamar a una función. La variable correspondiente en Trelis sería xdebug_scream.
Puedes ver todas las opciones de configuración disponibles en roles/xdebug/defaults/main.yml y leer sobre como son utilizadas en Xdebug en la página de documentación. Trellis cuenta con los mismos valores predeterminados, pero con la opción de sobreescribirlos de ser necesario. Para cambiar esas variables, es recomendable configurarlas en group_vars/<entorno>/php.yml.
Utilizando Xdebug en producción
Mientras Xdebug es instalado de forma predeterminada en development, instalarlo en otro entorno es "opt-in". No es recomendable utilizar Xdebug en producción, pero puede ser extremadamente útil en servidores con entornos similares a producción. Por ejemplo, si hay un problema detectado en production, pero no puede ser reproducido en development (en tu entorno Vagrant), es muy probable que el problema tenga que ver con algo relacionado a tu proveedor VPS. Duplicando tu entorno de producción y limpiando los datos utilizando algo como WP Hammer te permitirá hacer una depuración de tu servidor de producción sin afectarlo. Aquí es donde bin/xdebug-tunnel.sh entra en juego.
bin/xdebug-tunnel.sh: Xdebug + SSH tunnels
Xdebug brinda un montón de visibilidad a tu aplicación, que es probable no quieras dar a nadie. Debido a esto, debes restringir el acceso a las personas que quieran iniciar una sesión de depuración. La forma de hacerlo es creando un Túnel SSH remoto desde el VPS a tu computadora local. bin/xdebug-tunnel.sh hace que sea trivial definir una conexión instalando Xdebug en el host remoto así como también estableciendo el Túnel SSH entre tu servidor y tu computadora.
Por defecto, Trellis configura Xdebug para que vea una sesión de depuración en el puerto localhost 9000 del servidor:
# roles/xdebug/defaults/main.yml
xdebug_remote_host: localhost
xdebug_remote_port: 9000
Debido a que tu depurador se encuentra en tu computadora y no en el servidor, Xdebug intentará comunicarse con localhost:9000 sin éxito y procederá con el requerimiento en forma normal. bin/xdebug-tunnel.sh crea un túnel desde el localhost:9000 del servidor al localhost:9000 de tu computadora, generando un puente y permitiendo la comunicación entre ambos.
Estableciendo el túnel
Primero, echemos un vistazo al comando que utilizaremos para crear el túnel:
./bin/xdebug-tunnel.sh <action> <host>
El argumento action puede ser open o close y host el el hostname, IP, o alias de inventario en su archivo hosts/<environment>.
Una vez provisto este archivo hosts:
# supongamos hosts/staging
some_inventory_hostname ansible_ssh_host=12.34.56.78
[staging]
some_inventory_hostname
[web]
some_inventory_hostname
Usted ejecutará:
./bin/xdebug-tunnel.sh open some_inventory_hostname
Este script ejecuta el playbook xdebug-tunnel.yml con las variables necesarias para instalar Xdebug en el entorno así como también establecer el túnel.
Para cerrar el túnel, así como también deshabilitar Xdebug, ejecuta:
./bin/xdebug-tunnel.sh close some_inventory_hostname
Esto eliminará el symlink /etc/php/7.0/fpm/conf.d/20-xdebug.ini, deshabilitando efectivamente para ese entorno mientras se deja xdebug instalado. También cierra la conexión SSH.
Si no utilizas alias de inventario para tus archivos host, puedes también utilizar una dirección IP en vez del alias. Por ejemplo, si tus archivos hosts se ven de la siguiente manera:
[staging]
12.34.56.78
[web]
12.34.56.78
Puedes hacer esto:
./bin/xdebug-tunnel.sh open 12.34.56.78
Debes especificar el host exactamente de la misma manera que cuando abres y cierras el túnel. Si se cierra el túnel con un host distinto al que se abrió causará un error. Esto se debe a que el socket del túnel fue creado utilizando el parámetro host que se pasó originalmente:
/tmp/trellis-xdebug-{{ provided host }}