Ocultar, mostrar errores de ejecución de PHP

 
Dependiendo las circunstancias en que se estén ejecutando los scripts PHP, se puede desear que se muestren los errores (desarrollo) o no (producción).
Con PHP se pueden establecer las directivas para mostrar o no los errores, y en caso de mostrarlos, que tipo de error mostrar.

Los tipos de error que se pueden establecer para mostrar / ocultar en PHP son:

CONSTANTEVALORDESCRIPCIÓN
E_ERROR1Errores fatales que interrumpen la ejecución del código, por ejemplo llamada a una función sin la cantidad de valores requeridos.
E_WARNING2Errores no fatales, la ejecución puede seguir. Por ejemplo inicializar una sesión una vez enviados datos.
E_PARSE4Errores del interprete en tiempo de compilación. Por ejemplo si falta un punto y coma al final de una instrucción.
E_NOTICE8Notificaciones de posibles errores. Por ejemplo si no se ha inicializado una variable antes de usarla.
E_CORE_ERROR16Errores de núcleo. error interno de PHP.
E_CORE_WARNING32Advertencias de núcleo (error no fatal). error interno de PHP.
E_COMPILE_ERROR64Errores internos en tiempo de compilación. Generados por el motor de Zend.
E_COMPILE_WARNING128Mensajes de advertencia internos en tiempo de compilación. Generados por el motor de Zend.
E_USER_ERROR256Errores generados por el usuario mediante trigger_error.
E_USER_WARNING512Mensaje de advertencia generado por el usuario mediante trigger_error.
E_USER_NOTICE1024Notificación generada por el usuario mediante trigger_error.
E_STRICT2048Errores de PHP estricto. Por ejemplo si se usa una función obsoleta o utilización no recomendable de variables.
E_RECOVERABLE_ERROR4096Errores capturables. Errores de código probablemente peligrosos, pero que no afectaron al núcleo.
E_DEPRECATED8192Aviso en código de utilización de funciones obsoletas.
E_USER_DEPRECATED16384Aviso en código de utilización de funciones obsoletas generado por el usuario mediante trigger_error.
E_ALL32767El valor numérico puede variar en diferentes versiones. Engloba todos los errores disponibles. Debido a la aparición de nuevos tipos de error, los errores con valor mayor a 2047, pueden no ser incluidos.


Los valores de estas constantes representan posiciones de campos de bits, es decir cada valor representa una posición de un bit, he aquí una tabla con los valores en decimal y en binario:

CONSTANTEDECIMALBINARIO
E_ERROR11
E_WARNING210
E_PARSE4100
E_NOTICE81000
E_CORE_ERROR1610000
E_CORE_WARNING32100000
E_COMPILE_ERROR641000000
E_COMPILE_WARNING12810000000
E_USER_ERROR256100000000
E_USER_WARNING5121000000000
E_USER_NOTICE102410000000000
E_STRICT2048100000000000
E_RECOVERABLE_ERROR40961000000000000
E_DEPRECATED819210000000000000
E_USER_DEPRECATED16384100000000000000
E_ALL32767111111111111111


Por lo que E_ALL, es la suma de los errores anteriores, por lo que los engloba a todos. De esta forma si se quisiera mostrar unos errores u otros, se deberían usar los operadores binarios. Por ejemplo, si se quisiera mostrar todos los errores excepto las notificaciones, sería "E_ALL ^ E_NOTICE", si se quisieran mostrar sólo los errores de ejecución "E_ERROR | E_WARNING | E_PARSE", si se quisiese que no se muestre ningún error, bastaría con pasar como valor "0" (cero).

Una vez conocidos los tipos diferentes de errores, sus valores y sus constantes, queda establecer como configurarlos. Esto se puede hacer de tres formas:

Configuración a nivel de servidor

Se pueden modificar los parámetros del fichero php.ini para hacer que siempre se muestren los tipos de errores deseados (o ninguno) así como diferentes opciones.
Este es el método mas recomendable, ya que sólo cambiando en un fichero, se establece la configuración de todas las páginas. Las diferentes directivas que se pueden establecer son:

DIRECTIVAPREDETERMINADODESCRIPCIÓN
error_reportingE_ALL & ~E_NOTICEPredeterminado a partir de la versión 4 (todos, menos notificaciones). Permite establecer los tipos de errores a mostrar en la web.
display_errors1Si los errores reportados, deben ser mostrados por pantalla (1) o no (0) (se podrían encontrar en los ficheros de log).
display_startup_errors0Si los errores del arranque de PHP, deben ser mostrados (1) o no (0) (se podrían encontrar en los ficheros de log).
log_errors0Si los mensajes de error, deben ser mostrados en el archivo dado en "error_log" (1) o en el registro del servidor (0).
log_errors_max_len1024Establece el tamaño máximo en bytes del archivo dado en "error_log", 0 permite no aplicar tamaño máximo. Cuando el tamaño es excedido, se eliminan los mensajes mas antiguos.
ignore_repeated_errors0No muestra errores repetidos (en la misma linea del mismo archivo).
ignore_repeated_source0No muestra errores repetidos (en cualquier linea de cualquier archivo).
report_memleaks1Muestra informe de perdidas de memoria detectados por el gestor de memoria Zend (1). El informe es enviado al stderr en sistemas POSIX, o al depurador en sistemas Windows. La directriz error_reporting, debe incluir E_WARNING
track_errors0En caso de estar activado (1), la variable $php_errormsg contendrá el último error encontrado.
html_errors1Muestra los errores con contenidos HTML (permite pulsar para acceder a ayuda en linea) en caso de estar activado (1), o en texto plano en caso de estar desactivado (0).
xmlrpc_errors0En caso de estar activado (1), muestra los errores como mensajes XML-RPC (sobreescribe a html_errors).
xmlrpc_error_number0Valor del elemento faultCode de XML-RPC.
docref_root""Url del documento de referencia a pasar el error cuando se produzca, para mostrar la información del manual.
docref_ext""Extensiones de los archivos de los documentos de manual pasados en docref_root.
error_prepend_stringNullCadena a mostrar antes de un error.
error_append_stringNullCadena a mostrar después de un error.
error_logNullNombre del archivo de log donde registrar los errores.


Configuración a nivel de directorio

Se pueden configurar las directrices mostradas en la configuración a nivel de servidor (excepto xmlrpc_errors), pero en un archivo de configuración dentro de un directorio, como por ejemplo en Apache el archivo .htaccess. Los valores que se dieran en este fichero, sobreescribirían la configuración dada en php.ini y afectarían a todo el directorio en el que se encuentre el fichero.
Para establecer un valor a cualquier directiva, sería de la siguiente forma:

php_value NOMBRE_DIRECTIVA VALOR_DIRECTIVA


Algunos ejemplos podrían ser:

# Los errores se muestran por pantalla:
php_value display_errors 1
# Los errores son enviados al archivo de log:
php_value log_errors 1


Las constantes mostradas en la tabla de los valores para errores, no son recogidas por htaccess, por lo que habría que introducir el valor numérico en vez de esta.

Configuración en código PHP

En caso de que se desee mostrar o definir el comportamiento a nivel de un fichero php, también se puede hacer.
La función ini_set, permite establecer una directiva de configuración, por lo que con esta función se pueden definir todas las directivas mostradas en la tabla, en la configuración a nivel de servidor (ecepto xmlrpc_errors). Ejemplo:

ini_set("html_errors", 1);

Además, PHP dispone de funciones especificas para manejar los errores:

error_reporting(valor_error): Esta función se comporta exactamente igual que la directiva de configuración "error_reporting", el parámetro a pasar (valor_error), debe ser un valor de error, por ejemplo:

error_reporting(E_ERROR | E_WARNING);


error_get_last(): Esta función sólo está disponible a partir de la versión 5.2.0 y devuelve un array con la información del último error ocurrido. Este array consta de 4 claves:
  • type: El tipo de error. Devuelve un valor numérico que representa el tipo de error (ver tabla de errores).
  • message: El mensaje informativo del error.
  • file: El fichero donde se produjo el error.
  • line: La linea donde se produjo el error.


$php_errormsg: Es una variable que contiene el último error ocurrido en PHP, para que esta variable esté activa, debe estar activada la directiva "track_errors".


Código:
<?php
    // Copyright © McAnam.com
    // http://www.mcanam.com/articulos/PHP.php?id=18

    // Definición de errores
    error_reporting(E_ALL);
    // Sólo necesario en caso de que la versión de PHP sea inferior a 5.2.0
    ini_set("track_errors", true);
    
    // Forzado de errores (notificaciones)
    echo hola;
    echo adios;
    
    echo "<br/>---------------------<br />";
    
    // Se muestran los datos del último error
    // En caso de que se pueda ejecutar error_get_last (5.2.0) o no
    if (function_exists("error_get_last"))
        print_r(error_get_last());
    else
        echo $php_errormsg;

?>

Links relacionados:
Variables globales de servidor con $_SERVER
Sesiones. Crear variables de sesión con PHP
Saber si una tabla de una BD existe


Para cualquier duda, consulta, sugerencia, opinión, colaboración, etc; no dude en ponerse en contacto con nosotros

Copyright © 2002-2017 [McAnam]. Reservados todos los derechos.
www.mcanam.com