Deshabilitar mensajes de depuración en PHP 7

Ubuntu Server es una distribución de Linux popular, gratuita y de código abierto que podemos usar para configurar rápidamente una pila LAMP (Linux, Apache, MySQL, PHP). La facilidad de instalación y el soporte a largo plazo de Ubuntu Server lo convierten en una opción popular entre los desarrolladores de PHP.

Con una instalación de servidor limpia, podemos poner en marcha la pila LAMP simplemente ejecutando los siguientes comandos:

sudo apt-get update && sudo apt-get upgrade
sudo apt-get install lamp-server^

Una vez hecho esto, visitando la dirección IP de nuestro servidor externo, deberíamos ver una página de Apache, como se muestra en la siguiente captura de pantalla:

El HTML que estamos viendo en el navegador se origina en el archivo /var/www/html/index.html. Después de reemplazar index.html con index.php, estamos bien para jugar con el código PHP.
La razón de esta introducción similar a Ubuntu Server es enfatizar
ciertos valores predeterminados del servidor. De todas las directivas de configuración, nunca debemos aceptar ciegamente los valores predeterminados para el registro de errores y las directivas de visualización de errores sin comprenderlos realmente. El cambio constante entre entornos de desarrollo y producción lo hace
Demasiado fácil exponer información confidencial dentro del navegador o perder el registro del error correcto.
Con eso en mente, supongamos que tenemos el siguiente archivo index.php roto en nuestra pila LAMP de Ubuntu Server recién instalada:

<?php
echo 'Test;

Al intentar abrir esto en el navegador, Apache enviará un error interno del servidor HTTP 500 que, según el navegador, puede ser visible para el usuario final, como se muestra en la siguiente captura de pantalla:

Idealmente, tendríamos nuestro servidor web configurado con una página de error genérica bien diseñada, solo para que sea más fácil de usar. Si bien la respuesta del navegador puede satisfacer al usuario final, ciertamente no satisface al desarrollador en este caso. La información devuelta no indica algo sobre la naturaleza del error, lo que hace que sea difícil solucionarlo. Afortunadamente, para nosotros, la configuración predeterminada de la pila LAMP en este caso incluye registrar el error en un archivo /var/log/apache2/error.log:

[Thu Feb 02 19:23:26.026521 2017] [:error] [pid 5481] [client
93.140.71.25:55229] PHP Parse error: syntax error, unexpected ''Test;'
(T_ENCAPSED_AND_WHITESPACE) in /var/www/html/index.php on line 3

Si bien este comportamiento es perfecto para la producción, es engorroso para el entorno de desarrollo. Al desarrollar, realmente nos gustaría que nuestros errores aparezcan en el navegador, solo para acelerar las cosas. PHP nos permite controlar el informe de errores y el comportamiento de registro a través de varias directivas de configuración, siendo las más importantes las siguientes:

  • error_reporting: este es el nivel de error que deseamos monitorear; podemos usar el operador de tubería (|) para enumerar varias constantes de nivel de error. Su valor predeterminado es E_ALL & ~ E_NOTICE & ~ E_STRICT & ~ E_DEPRECATED.
  • display_errors: esto especifica si los errores deben enviarse al navegador / CLI o deben ocultarse al usuario.
  • error_log: este es el archivo donde queremos registrar errores de PHP.
  • log_errors: esto nos dice si debemos registrar el error en el archivo error_log.

Las constantes de nivel de error disponibles se definen de la siguiente manera:

  • E_ERROR (1)
  • E_WARNING (2)
  • E_PARSE (4)
  • E_NOTICE (8)
  • E_CORE_ERROR (16)
  • E_CORE_WARNING (32)
  • E_COMPILE_ERROR (64)
  • E_COMPILE_WARNING (128)
  • E_USER_ERROR (256)
  • E_USER_WARNING (512)
  • E_USER_NOTICE (1024)
  • E_STRICT (2048)
  • E_RECOVERABLE_ERROR (4096)
  • E_DEPRECATED (8192)
  • E_USER_DEPRECATED (16384)
  • E_ALL (32767)

Usando las funciones error_reporting() e ini_set(), podemos usar algunas de estas directivas para configurar el registro y la visualización durante el tiempo de ejecución:

<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');

Tenga cuidado al usar ini_set() para display_errors ya que no tendrá ningún efecto si el script tiene errores fatales, simplemente porque el tiempo de ejecución no se ejecuta.

La visualización de errores y el registro de errores son dos mecanismos diferentes que funcionan de la mano entre sí. Si bien es probable que nos beneficiemos más de la visualización de errores en entornos de desarrollo, el registro de errores es el camino a seguir para los entornos de producción.

Comparte