Xdebug

Xdebug es una extensión de PHP que proporciona capacidades de depuración, rastreo y creación de perfiles. El componente depurador utiliza el protocolo de depuración DBGp para establecer la comunicación entre un motor de secuencias de comandos PHP y un IDE depurador. Hay varios IDEs y editores de texto que soportan el protocolo de depuración DBGp los siguientes son solo algunos de los más populares:

Si bien el soporte del protocolo de depuración DBGp puede parecer suficiente como factor de selección del depurador, lo que realmente diferencia a estos IDE y editores de texto es su nivel de soporte para las últimas versiones de PHP.

Con su soporte de PHP de vanguardia y soluciones innovadoras, PhpStorm es probablemente la opción comercial más popular entre los desarrolladores profesionales de PHP. Teniendo en cuenta la tarifa promedio por hora de un PHP experto desarrollador, el costo de la herramienta parece bastante caro con respecto a la abundancia de características que aceleran el trabajo de desarrollo.

Para comprender mejor las capacidades de Xdebug, sigamos adelante y realicemos los siguientes pasos:

  1. Instale la pila LAMP.
  2. Instale la extensión Xdebug.
  3. Instale NetBeans.
  4. Tire de la aplicación PHP de muestra como nuestro patio de recreo para la depuración.
  5. Configure la depuración.
  6. Configurar el seguimiento.
  7. Configure la creación de perfiles.

Instalación

Suponiendo que tenemos una nueva instalación de Ubuntu 17.04 (Zesty Zapus), instalar la pila LAMP completa y la extensión Xdebug es fácil a través de los siguientes comandos:

apt-get update
apt-get -y install lamp-server^
apt-get -y install php-xdebug
sudo service apache2 restart

Una vez que se realiza este proceso, abrir http: //localhost/index.html en nuestro navegador debería darnos una página de Apache predeterminada. Ahora, sigamos adelante y hagamos algunos cambios de permisos:

sudo adduser user_name www-data
sudo chown -R www-data:www-data /var/www
sudo chmod -R g+rwX /var/www

Asegúrese de reemplazar user_name con el nombre del usuario real en el sistema.

La razón para hacer esta actualización de permisos es hacer posible que el IDE de NetBeans de un usuario acceda al directorio /var/www/html/, donde se ubicará nuestro proyecto. Una vez que se ejecutan estos comandos, debemos cerrar sesión e iniciar sesión, o reiniciar la computadora para tener permisos para entrar.
Ahora podemos ejecutar el siguiente comando en la consola y luego abra http: //localhost/index.php para confirmar si PHP y Xdebug están funcionando:

rm /var/www/html/index.html
echo "" > /var/www/html/index.php

Esto debería darnos una salida que indique la presencia de la extensión Xdebug, muy similar a la siguiente captura de pantalla:

Hasta este punto, simplemente hemos instalado la extensión, pero realmente no hemos habilitado ninguna de sus tres características principales: depuración, seguimiento y creación de perfiles. Antes de continuar con la depuración, instalemos rápidamente NetBeans IDE. Esto hará que nuestros esfuerzos de depuración sean mucho más fáciles. Nosotros primero debemos descargar NetBeans para PHP desde https://netbeans.org/downloads/.
Una vez descargado y desempaquetado, podemos ejecutar el siguiente comando:

chmod +x netbeans-8.2-php-linux-x64.sh
./netbeans-8.2-php-linux-x64.sh

Vale la pena señalar que el uso de NetBeans IDE aquí es completamente opcional. Podríamos haber utilizado fácilmente una de las otras soluciones gratuitas o incluso comerciales. Ahora sería un buen momento para abrir NetBeans IDE; haga clic en Archivo | Nuevo proyecto | Categorías [PHP] | Proyectos [PHP
Aplicación con fuentes existentes] y apúntelo a nuestro directorio /var/www/html/, como se muestra en la siguiente captura de pantalla:

Una vez que completemos los datos requeridos en la pantalla Nombre y Ubicación, al hacer clic en Siguiente nos lleva a la configuración Ejecutar configuración:

Al hacer clic en el botón Finalizar finaliza la configuración del proyecto, y ahora deberíamos poder ver nuestro archivo index.php:

Finalmente, avancemos y obtengamos nuestra aplicación de muestra ejecutando los siguientes comandos de consola:

rm /var/www/html/index.php
cd /var/www/html/
git init
git remote add origin git@github.com:ajzele/MPHP7-CH16.git
git pull origin master

El IDE de NetBeans debería poder detectar instantáneamente estos cambios en su pestaña Proyectos. Hasta este punto, en realidad no hemos hecho ninguna configuración o configuración relacionada con los componentes de depuración, rastreo o creación de perfiles de Xdebug. Simplemente instalamos la pila LAMP, Xdebug
en sí, NetBeans IDE y sacó la aplicación de muestra. Ahora, sigamos adelante y analicemos el componente de depuración de Xdebug.

Debugging

La función de depuración de Xdebug se puede activar fácilmente con la opción
xdebug.remote_enable = 1. Con PHP moderno, generalmente hay un archivo especial de configuración xdebug.ini; de lo contrario, editaríamos el archivo php.ini predeterminado. Con nuestra instalación de Ubuntu, agregamos esto al archivo /etc/php/7.0/apache2/conf.d/20-xdebug.ini de la siguiente manera:

zend_extension=xdebug.so
xdebug.remote_enable=1

Una vez que el archivo ha sido modificado, debemos asegurarnos de que el servidor Apache se reinicie:

service apache2 restart

Si bien xdebug.remote_enable es la opción requerida para activar la función de depuración, otras opciones relacionadas incluyen las siguientes:

  • xdebug.extended_info
  • xdebug.idekey
  • xdebug.remote_addr_header
  • xdebug.remote_autostart
  • xdebug.remote_connect_back
  • xdebug.remote_cookie_expire_time
  • xdebug.remote_enable
  • xdebug.remote_handler
  • xdebug.remote_host
  • xdebug.remote_log
  • xdebug.remote_mode
  • xdebug.remote_port

Información suplementaria sobre la configuración del depurador individual
Las opciones se pueden encontrar en https://xdebug.org/docs/all_settings.

De vuelta en NetBeans, podemos centrarnos en la barra de herramientas de depuración:

Cuando hacemos clic en el botón Proyecto de depuración, NetBeans inicia un navegador con la URL http: //localhost/index.php? XDEBUG_SESSION_START = netbeans-xdebug y
activa los botones previamente deshabilitados.
Los botones disponibles en la barra de herramientas de depuración nos presentan varias opciones de depuración:

  • Paso a paso: Esto le dice al depurador que vaya a la siguiente llamada de función y se interrumpa allí.
  • Paso: esto le dice al depurador que ejecute la siguiente función y se rompa después.
  • Paso a paso: Esto le dice al depurador que finalice la función actual y se rompa después de ella.
  • Ejecutar a cursor: tiene un doble papel doble. Cuando se usa en combinación con puntos de interrupción habilitados, salta directamente de un punto de interrupción a otro. Cuando los puntos de interrupción están deshabilitados, salta directamente a la línea donde posicionamos nuestro cursor. Por lo tanto, podemos depurar de una manera libre, ya que decidimos dinámicamente el siguiente punto de interrupción después de que se inicia el proceso de depuración, simplemente colocando nuestro cursor donde sea necesario.

La opción Ejecutar al cursor parece un primer enfoque sensato y directo. Avancemos y establezcamos varios puntos de interrupción en nuestra aplicación de muestra de la siguiente manera:

  • index.php: Esto es un total de seis puntos de interrupción:
  • src/Foggyline/Catalog/Model/Category.php: Esto es un total de uno punto de interrupción:

src/Foggyline/Catalog/Block/Category/View.php: Esto es un total de un punto de interrupción:

Los siguientes pasos describen una depuración utilizando solo el botón Ejecutar al cursor:

1.Haga clic en Proyecto de depuración. Esto salta a la línea 3 de index.php y registra lo siguiente:

2.Haga clic en Ejecutar al cursor. Esto salta a la línea 11 de index.php y registra lo siguiente:

Observe cómo la pestaña Puntos de interrupción ahora muestra una flecha verde al lado de index.php: 11.

3.Haga clic en Ejecutar al cursor. Esto salta a la línea 15
de src/Foggyline/Catalog/Model/Category.php y registra lo siguiente:

4.Haga clic en Ejecutar al cursor. Esto salta a la línea 15 del archivo index.php y registra lo siguiente:

5.Haga clic en Ejecutar al cursor. Esto salta a la línea 18 del archivo index.php y registra lo siguiente:

6.Haga clic en Ejecutar al cursor. Esto salta a la línea 23 del archivo index.php y registra lo siguiente:

7.Haga clic en Ejecutar al cursor. Esto salta a la línea 25 del archivo index.php y registra lo siguiente:

8.Haga clic en Ejecutar al cursor. Esto salta a la línea 22 de
el archivo src/Foggyline/Catalog/Block/Category/View.php y registra lo siguiente:

9.Haga clic en Ejecutar al cursor. Esto salta a la línea 22 de
el archivo src/Foggyline/Catalog/Block/Category/View.php y registra lo siguiente:

10.Haga clic en Ejecutar al cursor. Esto salta a la línea 22 de
el archivo src/Foggyline/Catalog/Block/Category/View.php y registra lo siguiente:

11.Haga clic en Ejecutar al cursor. Esto salta a la línea 27 del archivo index.php y registra lo siguiente:

12.Haga clic en Ejecutar al cursor. Esto nos deja en la línea 27 del archivo index.php cuando llega a nuestro último punto de depuración donde registra lo siguiente:

Ahora podemos hacer clic en el botón Finalizar sesión del depurador.

A lo largo de este proceso de doce pasos, podemos observar claramente un comportamiento de IDE y los valores que logra registrar. Hace que sea fácil apuntar a partes específicas de nuestro código y luego observar las variables a medida que cambian durante el proceso de depuración.
Tenga en cuenta que entre los pasos 10 y 11, nunca vemos los valores de registro de la pestaña Variables para nuestro tercer producto. Esto se debe a que las variables se registran después de pasar el punto de interrupción de depuración dado, que, en este caso, cambia el contexto del archivo de clase View.php a
un archivo index.php Aquí es donde hacer clic en el botón Step Into podría haber sido útil, ya que nos permitiría profundizar más en el código dentro del cuerpo durante la ejecución del tercer ciclo, produciendo así valores para el tercer producto.
Debemos alentar la mezcla y el uso de todas las opciones de depuración para alcanzar y leer adecuadamente las variables de interés.

Rastreo

La función de rastreo de Xdebug se puede activar fácilmente con
la opción xdebug.auto_trace = 1. Con nuestra instalación de Ubuntu, agregamos esto al archivo /etc/php/7.0/apache2/conf.d/20-xdebug.ini de la siguiente manera:

zend_extension=xdebug.so
xdebug.remote_enable=1
xdebug.auto_trace=1

Una vez que el archivo ha sido modificado, debemos asegurarnos de que el servidor Apache se reinicie:

service apache2 restart

Si bien xdebug.auto_trace es la opción requerida para activar la función de rastreo, otras opciones relacionadas incluyen las siguientes:

  • xdebug.collect_assignments
  • xdebug.collect_includes
  • xdebug.collect_params
  • xdebug.collect_return
  • xdebug.show_mem_delta
  • xdebug.trace_enable_trigger
  • xdebug.trace_enable_trigger_value
  • xdebug.trace_format
  • xdebug.trace_options
  • xdebug.trace_output_dir
  • xdebug.trace_output_name
  • xdebug.var_display_max_children
  • xdebug.var_display_max_data
  • xdebug.var_display_max_depth

Se puede encontrar información adicional sobre las opciones de configuración de rastreo individual en https://xdebug.org/docs/execution_trace.

A diferencia de la función de depuración, que controlamos desde IDE o editor de texto, no podemos controlar el rastreo. De forma predeterminada, la función de seguimiento crea un archivo de seguimiento.% C diferente en el directorio / tmp cada vez que se ejecuta una aplicación. Lo que esto significa en el contexto de la web
La aplicación es que, cada vez que actualizamos la página en el navegador, la función de rastreo crea un archivo de rastreo.% c para nosotros.
Nuestra aplicación de ejemplo específica, una vez ejecutada, da como resultado un archivo de seguimiento, muy parecido a la siguiente captura de pantalla:

La salida en sí es relativamente fácil de leer y comprender para un desarrollador. Seguramente, esto se vuelve un poco torpe cuando se trata de aplicaciones grandes, ya que terminamos con un gran archivo de seguimiento. Aún así, conociendo los bits de código a los que apuntamos, podemos buscar el archivo y encontrar las ocurrencias necesarias del código. Supongamos que estamos buscando el uso de la función number_format() en todo nuestro código. Una búsqueda rápida de number_format nos indicaría la línea 22 de Category/View.php, con un tiempo de ejecución al lado. Esta es una información valiosa para los esfuerzos generales de depuración.

Perfiles

La función de creación de perfiles de Xdebug se puede activar fácilmente con
la opción xdebug.profiler_enable = 1. Con nuestra instalación de Ubuntu, modificaremos el archivo /etc/php/7.0/apache2/conf.d/20-xdebug.ini de la siguiente manera:

zend_extension=xdebug.so
xdebug.remote_enable=1
xdebug.auto_trace=1
xdebug.profiler_enable=1

Una vez que el archivo ha sido modificado, debemos asegurarnos de que el servidor Apache se reinicie:

service apache2 restart

Si bien xdebug.profiler_enable es la opción necesaria para activar la función de creación de perfiles, otras opciones relacionadas incluyen las siguientes:

  • xdebug.profiler_aggregate
  • xdebug.profiler_append
  • xdebug.profiler_enable
  • xdebug.profiler_enable_trigger
  • xdebug.profiler_enable_trigger_value
  • xdebug.profiler_output_dir
  • xdebug.profiler_output_name

Se puede encontrar información adicional sobre las opciones de configuración del generador de perfiles individuales en https://xdebug.org/docs/profiler.

Similar al rastreo, no podemos controlar la función de creación de perfiles desde IDE o editor de texto. De manera predeterminada, la función de creación de perfiles crea un archivo cachegrind.out.% P diferente en el directorio /tmp cada vez que se ejecuta una aplicación.
Nuestra aplicación de ejemplo específica, una vez ejecutada, da como resultado un archivo cachegrind, muy similar a la siguiente captura de pantalla (salida parcial):

La información contenida aquí es mucho menos legible que la de un archivo de rastreo, que está bien ya que los dos tipos de información de destino diferentes. El archivo cachegrind se puede extraer en una aplicación como KCachegrind o QCacheGrind, lo que nos da mucha representación más visual y fácil de usar de la información capturada:

La salida del archivo cachegrind ofrece información importante relacionada con el rendimiento. Obtenemos una idea de todas las funciones utilizadas en la aplicación, ordenadas por el tiempo dedicado a una función individual y todos sus elementos secundarios. Esto nos permite detectar cuellos de botella en el rendimiento, incluso si está dentro del marco de tiempo de milisegundos.

Comparte