Xdebug - Depuración profesional de PHP

Nuestra agenda

  1. Introducción al tema..
  2. Descarga e instalación de Xdebug en su máquina local (Mac OS X 10.6.6+, MAMP 2.1.1).
  3. Integración con PhpStorm.
  4. Practicar la depuración.

Que necesitarás

  • Una Mac con Mac OS X 10.6.6+.
    • Si estas en 10.8.X tu mayo Necesito instalar XQuartz ya que Apple quitó X11.
    • Si está en Windows, todo el proceso es un poco más sencillo, solo presione Google para obtener más detalles.
  • Apple Xcode 4.6 (gratis en la Mac App Store).
    • Herramientas de línea de comandos.
  • Homebrew.
  • Una aplicación de terminal de su elección..
  • PhpStorm 5+ (muchos otros IDE también funcionarán).

¿Qué es Xdebug??

Bueno, técnicamente, Xdebug es una extensión para PHP para hacer tu vida más fácil a la vez que depura tu código. En este momento, puede estar acostumbrado a depurar su código con varias otras soluciones simples. Estos incluyen el uso de eco declaraciones en diferentes estados dentro de su programa para averiguar si su aplicación pasa una condición o para obtener el valor de una determinada variable. Además, a menudo puedes usar funciones como var_dump, print_r u otros para inspeccionar objetos y matrices.

A menudo me encuentro con pequeñas funciones de ayuda, como esta, por ejemplo:

función de volcado ($ valor) echo '
'; var_dump ($ valor); eco '
';

La verdad es que yo también solía hacer esto durante mucho tiempo..

La verdad es que también solía hacer esto durante mucho tiempo. Entonces, ¿qué tiene de malo? Técnicamente, no hay nada de malo en ello. Funciona y hace lo que debe hacer..

Pero imagínese por un momento, a medida que sus aplicaciones evolucionen, puede adquirir el hábito de rociar todo el código con pequeños ecos, var_dumps y depuradores personalizados. Ahora concedido, esto no es obstructivo durante su flujo de trabajo de prueba, pero ¿qué sucede si olvida limpiar parte de ese código de depuración antes de que llegue a producción? Esto puede causar algunos problemas bastante alarmantes, ya que esos pequeños depuradores pueden incluso encontrar su camino en el control de versiones y permanecer allí durante mucho tiempo..

La siguiente pregunta es: ¿cómo se depura en la producción? Nuevamente, imagine que está navegando en uno de sus servicios web favoritos y de repente obtiene en la pantalla un gran volcado de información de depuración. Ahora, por supuesto, puede desaparecer después de la próxima actualización del navegador, pero no es una experiencia muy buena para el usuario del sitio web.

Ahora, por último, ¿alguna vez ha deseado poder recorrer su código, línea por línea, ver expresiones e incluso ingresar a una llamada de función para ver por qué produce el valor de retorno incorrecto??

Bueno, definitivamente debes sumergirte en el mundo de la depuración profesional con Xdebug, Como puede resolver todos los problemas anteriores..


Configurando MAMP

No quiero profundizar demasiado en el proceso de descarga e instalación de MAMP en una Mac. En su lugar, solo compartiré con usted que estoy usando PHP 5.4.4 y el Puerto Apache estándar (80) a lo largo de esta lectura..


Tu primera decision

Una nota rápida antes de comenzar con la construcción de nuestro propio Xdebug a través de Homebrew: Si desea tomar la ruta más fácil, MAMP ya viene con Xdebug 2.2.0. Para habilitarlo, abre:

/Aplicaciones/MAMP/bin/php/php5.4.4/conf/php.ini

con un editor de texto de su elección, vaya al final y elimine la última línea eliminando el ;.

Las dos últimas líneas del archivo deberían leerse así:

[xdebug] zend_extension = "/ Applications / MAMP / bin / php / php5.4.4 / lib / php / extensions / no-debug-non-zts-20100525 / xdebug.so"

Ahora si te estás preguntando:

"¿Por qué querría elegir una manera más difícil que esta?"

Y mi respuesta es que nunca es un error mirar más allá de tu borde y aprender algo nuevo. Especialmente como desarrollador en estos días, echar un vistazo a las cosas relacionadas con el servidor siempre será útil en algún momento. Prometido.


Instalar Xcode y herramientas de línea de comandos

Puede obtener Apple Xcode de forma gratuita fuera de la Mac App Store. Una vez que lo haya descargado, vaya a las preferencias de la aplicación, presione el "Descargas" pestaña e instala el "Herramientas de línea de comandos" de la lista.


Instalar homebrew

Homebrew es un pequeño administrador de paquetes para Mac OS X que te permite tener todo lo que Apple deja de lado. Para instalar Homebrew, simplemente pegue el siguiente comando en su terminal.

ruby -e "$ (curl -fsSkL raw.github.com/mxcl/homebrew/go)"

En una Mac, Homebrew será la forma más conveniente de instalar Xdebug. Sin embargo, en Linux, compilarlo usted mismo es la mejor manera de hacerlo; lo que no es tan fácil en una Mac.

Consejo: los usuarios de Windows solo necesitan descargar el * .dll archivo de Xdebug.org, póngalo en la carpeta XAMPP y agregue la ruta a su php.ini expediente.

Como desarrollador de PHP, a partir de ahora debes tener en cuenta el repositorio Github "homebrew-php" de José González, que contiene muchas "cervezas" útiles para ti. Si alguna vez te has preguntado cómo instalar PHP 5.4 manualmente, estás ahí.

Ahora, si tiene algún problema al instalar Homebrew, consulte el Léame de José.

Para completar nuestra excursión Homebrew, queremos "aprovechar" las fórmulas de elaboración de cerveza de José ejecutando los siguientes comandos dentro de su aplicación de terminal:

cerveza artesanal / dupes

Esto nos dará algunas dependencias que necesitamos para las fórmulas de José..

brew tap josegonzalez / homebrew-php

¡Hecho! Ahora deberíamos estar listos para instalar Xdebug de manera cómoda, en una Mac.


Instala Xdebug

De vuelta en su aplicación de terminal, ejecute:

brew install php54-xdebug

Si está en PHP 5.3, simplemente reemplace el "4" con un "3";)

La instalación llevará algún tiempo. Una vez hecho esto, verás un pequeño icono de cerveza y algunas instrucciones adicionales que puedes ignorar..

Entonces, ¿qué acaba de pasar? Homebrew descargó todos los archivos, incluidas sus dependencias, y los construyó para ti. Como ya te dije, compilarte en una Mac puede ser una molestia. Al final, conseguimos una compilación reciente. xdebug.so situado en /usr/local/Cellar/php54-xdebug/2.2.1/.

Atención: tenga en cuenta que Homebrew instalará PHP 5.4 en su sistema durante el proceso. Esto no debería influir en nada ya que no está habilitado en su sistema.

Para finalmente instalar Xdebug, solo tenemos que seguir unos pasos más.

Cambio de directorio (discos compactos) a la carpeta de extensiones de MAMP:

cd /Aplicaciones/MAMP/bin/php/php5.4.4/lib/php/extensions/no-debug-non-zts-20100525

Puede volver a verificar la ruta mirando la última línea de /Aplicaciones/MAMP/bin/php/php5.4.4/conf/php.ini, ya que aquí es donde vamos.

Copia de seguridad de la existente xdebug.so por si acaso:

mv xdebug.so xdebug.so.bak

Luego copia tu versión de Homebrew Xdebug:

cp /usr/local/Cellar/php54-xdebug/2.2.1/xdebug.so /Applications/MAMP/bin/php/php5.4/lib/php/extensions/no-debug-non-zts-20100525

Si quieres forzar una copia (cp) comando para sobrescribir archivos existentes, simplemente haga cp -X objetivo de origen.

Por último, pero no menos importante, necesitamos modificar el php.ini Archivo para cargar el archivo de extensión Xdebug. Abierto /Aplicaciones/MAMP/bin/php/php5.4.4/conf/php.ini con un editor de texto de su elección, vaya al final y elimine el comentario de la última línea eliminando el punto y coma en la parte frontal. No cierres el archivo por el momento.

Ahora relanzar MAMP, ir a http: //localhost/MAMP/phpinfo.php. Si todo salió bien, debería encontrar esto dentro de la salida:


Si lo hiciera no trabajo, por favor asegúrese de que realmente copió sobre el xdebug.so y tener el camino correcto en tu php.ini expediente.


Iniciar la depuración

Antes de que podamos realmente comenzar la depuración, necesitamos habilitar Xdebug. Por lo tanto, espero que no hayas cerrado tu php.ini, Como tenemos que añadir esta línea hasta el final, después de la zend_extension opción:

xdebug.remote_enable = On

Guarda y cierra tu php.ini Archivo y reiniciar MAMP. Ir http: //localhost/MAMP/phpinfo.php de nuevo y busca xdebug.remote en el sitio. Tus valores deben verse exactamente como los míos:


Si no lo hacen, siga el mismo procedimiento que utilizó para agregar remote_enable = On para las otras declaraciones al final de su php.ini expediente.

Ahora, abra su IDE de elección. Puede utilizar Xdebug con varias soluciones de software populares como Eclipse, Netbeans, PhpStorm y también Sublime Text. Como dije antes, usaré PhpStorm EAP 6 para esta demostración..

Dentro de PhpStorm, abra las preferencias de la aplicación y encuentre su camino para "PHP \ Debug \ DBGp Proxy" en el lado izquierdo, como en la captura de pantalla siguiente:


Ahora elige tu clave IDE personal. Esto puede ser cualquier cadena alfanumérica que desee. Prefiero llamarlo Phpstorm, pero XDEBUG_IDE o mi nombre Estaría perfectamente bien también. Es importante establecer el "Puerto" valor para 9000 Como nuestra configuración estándar de Xdebug usa este puerto para conectarse al IDE.

Consejo: Si necesita ajustar esto, agregue xdebug.remote_port = número de puerto para usted php.ini expediente.

Atención: otros componentes pueden cambiar este valor dentro de PhpStorm, así que tenga cuidado si algo falla.

A continuación, haga clic en el pequeño botón rojo del teléfono con un pequeño error junto a él en la barra de herramientas superior. Debería volverse verde. Esto hace que PhpStorm escuche las conexiones entrantes de Xdebug.


Ahora necesitamos crear algo para depurar. Cree un nuevo archivo PHP, llámelo como desee y pegue el siguiente código:

 

Ahora este código es falso por defecto, pero lo arreglaremos en un momento, en la siguiente sección.

Asegúrese de que todo esté guardado y abra su navegador al script que acabamos de crear. Usaré Google Chrome para esta demostración, pero cualquier navegador funcionará..

Ahora tomemos un momento para comprender cómo se inicializa el proceso de depuración. Nuestro estado actual es: Xdebug habilitado como extensión Zend, escuchando en puerto 9000 para que aparezca una cookie durante una solicitud. Esta cookie llevará una clave IDE que debe ser la misma que configuramos dentro de nuestro IDE. Cuando Xdebug vea la cookie que lleva la solicitud, intentará conectarse a un proxy, nuestro IDE..

Entonces, ¿cómo conseguimos esa galleta en su lugar? PHP's setcookie? No. Aunque existen varias formas, incluso algunas para que esto funcione sin una cookie, usaremos una pequeña extensión de navegador como ayuda..

Instale el "ayudante de Xdebug" en su navegador Google Chrome o busque cualquier extensión que lo haga para el navegador que está usando.

Una vez que hayas instalado la extensión, haz clic derecho en el pequeño error que aparece en tu barra de direcciones y ve a las opciones. Configure el valor de la clave IDE para que coincida con la clave que eligió en su IDE, así:


Después de configurarlo, haga clic en el error y seleccione "Depurar" de la lista. El error debería volverse verde:


Ahora, vuelva a PhpStorm o su IDE de elección y establezca un "punto de interrupción". Los puntos de interrupción son como marcadores en una línea que le dicen al depurador que detenga la ejecución del script en ese punto de interrupción.

En PhpStorm, simplemente puede agregar puntos de interrupción haciendo clic en el espacio al lado de los números de línea en el lado izquierdo:


Solo intenta hacer clic donde aparece el punto rojo en la captura de pantalla. A continuación, tendrá un conjunto de puntos de interrupción en el que su secuencia de comandos debe pausar.

Nota: puede tener varios puntos de interrupción en tantos archivos como desee.

Ahora estamos listos. Vuelva a su navegador, asegúrese de que el error esté verde y vuelva a cargar la página para enviar la cookie con la siguiente solicitud.

Consejo: si configura una cookie, estará disponible para la próxima solicitud.

Si todo va según lo planeado, esta ventana debería aparecer dentro de PhpStorm para informarle de una conexión de depuración entrante:


¿No se abrió la ventana para ti? Hagamos un poco de resolución de problemas y repitamos lo que se debe configurar para que esto tenga éxito:

  1. Debes encontrar información de Xdebug dentro de phpinfo ()de salida. Si no, consigue el xdebug.so archivar en el lugar correcto y configurar su php.ini expediente.
  2. Establezca la configuración de PhpStorm DBGp en su clave IDE, por ejemplo. "PHPSTORM" y puerto "9000".
  3. Haga que PhpStorm escuche las conexiones de depuración entrantes utilizando el icono rojo del teléfono que luego se volverá verde.
  4. Establezca un punto de interrupción en su código, o seleccione "Ejecutar \ Break en primera línea en scripts PHP" Ser independiente de cualquier punto de ruptura. Tenga en cuenta que esto no es adecuado para el uso práctico.
  5. Obtén una extensión de navegador para configurar la cookie de Xdebug.
  6. Asegúrese de que la extensión del navegador tenga la misma clave IDE que eligió dentro de su IDE.
  7. Vuelve a cargar la página y PhpStorm debería obtener la conexión..

Si aparece el cuadro de diálogo en la imagen anterior, acéptelo. Esto te llevará al modo de depuración, así:


Puede ver que el depurador detuvo la ejecución del script en su punto de interrupción, resaltando la línea en azul. PHP ahora está esperando y controlado por Xdebug, que está siendo manejado por tus propias manos de ahora en adelante..

Nuestro espacio de trabajo principal será la sección inferior del IDE que ya muestra información sobre el script en ejecución (los superglobales).


¿Y usted miraría eso? Ahí está la cookie que acabamos de configurar para iniciar la sesión de depuración. Ahora puede hacer clic en los superglobales e inspeccionar sus valores en este mismo momento. PHP está esperando, no hay límite de tiempo, al menos no los 30 segundos predeterminados.

En el lado izquierdo, verás unos pocos botones. Por ahora solo "Jugar" y "Detener" son de interés para nosotros. El botón de reproducción verde reanudará la secuencia de comandos. Si hay otro punto de interrupción en el código, el script continuará hasta que llegue al punto de interrupción y se detenga nuevamente..

El botón rojo de parada aborta el script. Al igual que PHP salida o morir haría.


Ahora los realmente interesantes vienen en la sección superior de la ventana de depuración:


Vamos a echarles un vistazo rápidamente:

  1. Paso sobre: Esto significa paso una línea por delante..
  2. Entrar en: Si la línea azul resalta, por ejemplo, una llamada de función, este botón le permite avanzar a través de los puntos de vista de la función.
  3. Salir: Si ingresó a una función y desea salir antes de llegar al final, simplemente salga.
  4. Correr al cursor: Digamos que, por ejemplo, su archivo tiene 100 líneas de largo y su punto de interrupción se estableció en la línea dos para inspeccionar algo. Ahora desea correr rápidamente hasta el punto en el que acaba de hacer clic con el cursor hacia: este botón es para usted. Puede hacer clic "Paso sobre" norte tiempos también;)

Ahora no te preocupes, mientras usas Xdebug te adaptarás rápidamente a los atajos en el teclado.


Realmente depurando algún código de ejemplo

Ya te dije que el código que has copiado / pegado es falso, por lo que deberás depurarlo. Comience a pasar sobre el código, declaración por declaración.

Tenga en cuenta que la línea azul solo se detiene en las líneas que realmente contienen un comando. Los espacios en blanco y los comentarios serán omitidos..

Una vez que llegue a la función llame a Cargar datos, Por favor no entrar en ella, sólo paso y deténgase en el Si declaración.


Puedes ver dos nuevas variables en el "Variables" Panel en la parte inferior de la pantalla. Ahora, ¿por qué el $ datos variable retorno falso? Parece que el guión debería haber hecho su trabajo. Vamos a ver. Vuelva a la línea siete para ingresar a la llamada de función -> ¡bam! Recibimos un mensaje que nos informa que no podemos "dar un paso atrás". Para que su depurador vuelva a la línea siete, debe detener esta sesión y volver a cargar la página en el navegador. Hazlo y entra en la función call esta vez.

Parada en el regreso declaración dentro de la Cargar datos Funciona y ve que paso


los $ phpData La matriz está vacía. los regreso La declaración utiliza un operador ternario para detectar qué devolver. Y volverá falso para una matriz vacía.

Arregla la línea para decir:

devuelve $ phpData;

Como json_decode devolverá los datos o nulo en el fracaso Ahora detenga la sesión de depuración, vuelva a cargar su navegador y pase la llamada a la función esta vez.


Ahora parece que todavía tenemos un problema a medida que avanzamos en la condición. Por favor arregle la condición para usar es nulo() para detectar lo que está pasando:

if (is_null ($ data)) die ('No se pudieron cargar datos'); 

Ahora depende de ti intentarlo un poco. Yo sugeriría revertir el script a la versión original falsy, depurarlo con ecoy luego compara cómo se siente eso en comparación con el uso de Xdebug.


Conclusión

A lo largo de este artículo deberías haber adquirido muchos nuevos conocimientos. No dudes en leerlo de nuevo y en ayudar a un amigo a configurar Xdebug, nada mejor que eso.!

Es posible que desee intentar reemplazar su comportamiento de depuración habitual utilizando Xdebug en su lugar. Especialmente con proyectos más grandes, orientados a objetos, ya que son mucho más fáciles de depurar e incluso ponerse al día con el flujo, si no obtienes algo de inmediato.

Tenga en cuenta que esto es sólo la punta del iceberg. Xdebug ofrece mucha más potencia que también necesita ser explorada.

Por favor, siéntase libre de hacer cualquier pregunta en los comentarios y hágame saber lo que piensa.