Como hacer un debugging de emergencia de una aplicación de PHP corriendo en producción. En primer lugar, lo que detallo en este artículo es un primitivo procedimiento sólo de emergencia, donde se asume que el problema es de solución rápida.
El debugging o depurar o corregir errores es proceso propio en el desarrollo de aplicaciones, en PHP disponemos de XDebug para estos menesteres.
Advierto, no es prudente ni muchos menos recomendable hacerlo online en una aplicación web corriendo en producción.
Requerimientos para hacer el Debugging de Emergia de PHP:
- Contar con una cuenta SSH en el servidor de producción.
- Disponer de algún editor de textos en el servidor de producción, por ejemplo: nano o vi.
Si sólo tenemos acceso FTP, es posible emplear el procedimiento de emergencia descrito a continuación. Aunque con sólo acceso FTP estaríamos en extermo limitados.
Procedimiento de emergencia en PHP
El paso inicial, es determinar cual es la IP del equipo con el cual vamos a hacer este debugging de emergencia. Uno de los muchos servicios online que nos ayuda en determinar nuestra IP es:
Obteniendo nuestra IP, por ejemplo 192.16.184.0
. Entonces con esa IP, iniciamos una sesión SSH con el servidor de producción:
ssh user_name@192.16.184.0
Acto seguido, ubicamos el archivo donde inicia la ejecución de la aplicación, generalmente el index.php
y escribimos al comienzo de ese archivo el código:
<?php
// Este código se debe colocar al principio del
// archivo PHP de inicio de la aplicación.
//
$my_ip = '192.16.184.0';
$msg_maintenance = 'Estamos en Mantenimiento... volvemos en minutos.';
//
if ($_SERVER["REMOTE_ADDR"] <> $my_ip) die($msg_maintenance);
Esto nos permite bloquear la ejecución de la aplicación PHP a todos los visitantes, excepto a nosotros mismos, pues necesitamos mantener en ejecución la aplicación y así capturar los mensajes de error.
Lo siguiente es capturar los mensajes de error que genera PHP…
Capturando los mensajes de error de PHP
Para tal efecto debemos agregar seguidamente del código anterior, las siguientes directivas a PHP:
error_reporting(E_ALL|E_STRICT);
init_set('display_errors', 1);
Es decir, el código quedaría completo PHP para bloquear la web y habilitar los errores quedaría así:
<?php
$my_ip = '192.16.184.0';
$msg_maintenance = 'Estamos en Mantenimiento... volvemos en minutos.';
//
if ($_SERVER["REMOTE_ADDR"] <> $my_ip) die($msg_maintenance);
//
error_reporting(E_ALL|E_STRICT);
init_set('display_errors', 1);
Si hasta el momento los códigos de error desplegados por PHP no son suficientes para resolver el problema, pero tenemos ya indicios ciertos donde resolverlo rapidamente. Entonces inciamos un proceso que denominaremos ‘Depuración de PHP en la edad de piedra’… :-)
Depurar la aplicación PHP a mano
En este caso, necesitamos recorrer los distintos archivos de la aplicación en PHP auditando las variables, y así localizar y resolver el problema.
Para hacer el proceso anteriormente descrito nos valemos del siguiente código PHP, que es simplemente una sólo línea de PHP con dos instrucciones, estas son:
var_dump($variable_de_prueba);die(__FILE__.__LINE__);
La primera instrucción hace una llamada a la función var_dump()
que permite auditar variables o expresiones o salida de funciones. La segunda instrucción usa la función die()
que detiene la ejecución de PHP. Claro nos podríamos preguntar ¿Por qué no usar sólo?:
var_dump(...);die();
Pero ahí está el detalle, si usamos la función die
sin parámetros podríamos dejar accidentalmente este código en la aplicación y no tendríamos una forma rápida de ubicarlo y en vez de resolver el problema agregaríamos otro. Por esta razón, es útil llamarlo con los parámetros __FILE__.__LINE__
, pues nos indicará en que archivo de PHP se detuvo su ejecución y en qué número de línea.
Espero que este Tip de emergencia les sea de utilidad.
Recursos relacionados
- Depuración en PHP: http://php.net/manual/es/debugger.php
- Instrucción para ver la configuración de PHP desde la línea de comandos
php -i
. Usado en conjunto congrep
es muy útil. - Útiles funciones de PHP:
- Constantes predefinidas en PHP: http://php.net/manual/es/language.constants.predefined.php