Haz una pregunta »

PHP - Métodos de depuración

Mayo 2015





PHP dispone de buenas funciones de depuración, por lo que después de leer esto no tendrás ninguna excusa para intentar corregir tus errores tu mismo.
Todos estos métodos tienen que ver con la presentación de información de variables o sobre el contexto en un script.

I. Información sobre una variable


I.1 echo


La función mas básica para mostrar el valor de una variable es “echo”. Puede mostrar un número entero, una cadena de caracteres o un número real.

Por ejemplo, si una consulta SQL no funciona, entonces almacénala en una variable luego muéstrala en pantalla con un echo. Así podrás saber si el problema viene de una variable que posee un valor incoherente e incluso un valor Nulo.

También puedes testear tu consulta copiando y pegando lo que aparece en tu página Web.
Por ejemplo si utilizas MySQL, puedes testear tu consulta utilizando PhpMyAdmin o con el cliente MySQL oficial (utilizando una consola Linux o una ventana DOS bajo Windows).

I.2 print_r()


La función echo es muy practica pero limitada en ciertos casos. Por ejemplo no puede mostrar un array ni las características de un objeto. Para esto print_r es más potente. Esta función muestra el valor de un entero, una cadena o un real y te presenta de manera estructurada un array o un objeto.

I.3 var_dump() / var_export()


La función var_dump() devuelve el tipo de una variable o de los campos de un array, etc…así como su contenido exacto y, en las cadenas, el numero de caracteres. Si la variable contiene un valor “vacío o falso” como 0, (cadena vacía), Nula o Falsa, tendras el tipo y el valor exacto.

Var_export() es muy similar pero presenta estas informaciones como código PHP.

I.4 Redirigir la salida (no mostrar en pantalla)


Como “salida” se entiende a los datos que normalmente se muestra en pantalla.
Puede que tengas necesidad de imprimir los datos devueltos por var_dump o print_r en un fichero en vez que en la pantalla o en una pagina Web.
Supongamos que quieras imprimir estas informaciones en un fichero llamado test.log
Entonces deberás guardar en memoria los datos de salida utilizando la función ob_start() luego, al final de tu script, poner esta salida en una variable con ob_get_contents() luego eliminar estos datos destinados a la pantalla con ob_end_clean()
Finalmente bastará con escribir estos datos en el fichero.

Veamos el resultado:
Tengo un array llamado $tab, deseo imprimir su descripción en el fichero test.log en vez que en la pantalla:

<?
ob_start();
$tab=array(1=>'test',
	2=>'test2');
var_export($tab);

$tab_debug=ob_get_contents();
ob_end_clean();

$fichero=fopen('test.log','w');
fwrite($fichero,$tab_debug);
fclose($fichero);
?>


Ahora, los detalles del array $tab son guardados en el fichero y nada se ha mostrado en pantalla o en la pagina Web.

II. Backtrace


Un backtrace te permite reconstituir la ruta a través del llamado a funciones y la inclusión de ficheros para llegar a un punto dado en el código.

Veamos un ejemplo inspirado del sitio de PHP:
http://fr.php.net/manual/en/function.debug-print-backtrace.php
Tenemos una primera página (funciones.php)

<?php 

function b()
{
	var_dump(debug_backtrace());
}
function a()
{
	b();
}

a();

?>


Luego un segundo fichero que se llamará funciones.php (lo llamáremos main.php)

<?php
include 'funciones.php';
?>


Esto es lo que obtenemos:

array(3) {
  [0]=>
  array(4) {
    ["file"]=>
    string(29) "/funciones.php""
    ["line"]=>

    int(10)
    ["function"]=>
    string(1) "b"
    ["args"]=>
    array(0) {
    }
  }
  [1]=>
  array(4) {
    ["file"]=>
    string(29) "/funciones.php""
    ["line"]=>
    int(13)
    ["function"]=>
    string(1) "a"
    ["args"]=>
    array(0) {
    }
  }
  [2]=>
  array(4) {
    ["file"]=>
    string(30) "/main.php"
    ["line"]=>
    int(3)
    ["args"]=>
    array(1) {
      [0]=>
      string(29) "/funciones.php"
    }
    ["function"]=>
    string(7) "include"
  }
}


Tenemos 3 arrays, el análisis se hace comenzando por el último hasta llegar al primero si deseamos reconstituir el progreso del código desde el inicio.
En cada array tenemos:
function: la función que es llamada
args: los argumentos pasados a esta función (aquí, la ruta hacia funciones.php)
line: la línea concernida en el código
file: la ruta hacia el fichero php que está siendo tratado

En esta larga fila, para llegar hasta debug_backtrace(), observamos que pasamos por la función include en el fichero principal (main.php) luego por a() en el fichero funciones.php

Esto puede ser útil para ver como se comporta el código siguiendo el orden de llamado a las funciones y el valor de los parámetros que le son pasados como argumento.

La función debug_backtrace() devuelve un array conteniendo el reporte del contexto desde el lugar donde lo has llamado.
Yo lo he mostrado directamente utilizando var_dump() pero tu puedes utilizarlo como quieras, almacenarlo en una variable, etc.
La función debug_print_backtrace (PHP 5) te permitirá imprimir directamente el reporte.

III. Utilizar correctamente los reportes de error


PHP detalla bien los errores en paginas web (o en pantalla si utilizas PHP para una aplicación que no esta destinada a la web).

Puedes desactivar este reporte de error utilizando el operador @, pero utilízalo con moderación.
Es útil ya que puede permitirte no dar información sobre tu base de datos en un reporte de error, sin embargo es necesario pensar en manejar este error que no se mostrará.

Igualmente, indicar a PHP que te detalle todos los errores (configuración por defecto por lo general), utilizando la función error_reporting.

error_reporting(E_ALL);

IV. La palabra clave global


Existe en PHP una palabra clave que se llama “global”.
Esta te permite utilizar una variable de alcance global dentro de una función.
Sin embargo no lo utilices a menos que sea necesario.
Esta funcionalidad vuelve al código incomprensible, y su depuración difícil de seguir.

V. El depurador APD


PHP posee también funciones de depuración avanzadas reagrupadas bajo el nombre de APD.
Consulta este artículo sin tener que estar conectado, descárgalo gratis aquí en formato PDF:
Php-metodos-de-depuracion.pdf

Consulta también

En la misma categoría

PHP - Méthodes de débogage
Por kilian el 27 de marzo de 2006
PHP - Métodos de depuração (debugger)
Por pintuda el 17 de junio de 2011
El artículo original fue escrito por kilian. Traducido por Carlos-vialfa.
El documento « PHP - Métodos de depuración » de Kioskea (es.kioskea.net) se encuentra disponible bajo una licencia Creative Commons. Puedes copiarlo o modificarlo bajo las condiciones señaladas por esta licencia. Deberás hacerla siempre visible y dar crédito a Kioskea.