Cookies

Esta web utiliza cookies para obtener datos estadísticos de la navegación de sus usuarios. Si continúas navegando consideramos que aceptas su uso.

Evitar error reporting en producción en CodeIgniter

Bueno, como sabéis esto es un blog de desarrollo web. Hasta el momento casi siempre hemos estado mirando CakePHP, pero últimamente le estoy dando un poco al CodeIgniter, por lo que quiero aportar unas líneas al respecto de algún problemilla que me he encontrado con este framework y cómo resolverlo.

La primera sorpresa es ver que cuando te descargas el framework en el front controller (index.php) te encuentras con este regalazo:

<?php
...
if (defined('ENVIRONMENT')) {
    switch (ENVIRONMENT) {
        case 'development':
            error_reporting(E_ALL);
            break;
        case 'testing':
        case 'production':
            error_reporting(0);
            break;
        default:
            exit('The application environment is not set correctly.');
    }
}
...   

Para mi manera de verlo, o CodeIgniter asume que eres muy profesional y nunca metes la pata en producción o simplemente comete un error al deshabilitar el error reporting en producción. ¿Quién no ha ido nunca al log de apache a buscar un error que le está dando en producción?

Recordemos que no es lo mismo poner error_reporting a 0, que indicar en la directiva display_errors on o off. Con la llamada error_reporting(0); los errores automáticamente no se loguean.

Bueno, si tenemos la configuración del php.ini con display_errors = 'off';, podemos simplemente cambiar el error reporting a E_ALL. ¡Ojo! No lo hagáis sin saber de un fichero que CodeIgniter nos guarda en su interior en la ruta application/errors/error_php.php

<div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;">
    <h4>A PHP Error was encountered</h4>
    <p>Severity: <?php echo $severity; ?></p>
    <p>Message:  <?php echo $message; ?></p>
    <p>Filename: <?php echo $filepath; ?></p>
    <p>Line Number: <?php echo $line; ?></p>
</div>

Este fichero, siempre y cuando se produzca un error que entre dentro del error_reporting especificado, va a sacar por pantalla un "bonito" recuadro explicando el error y dando una referencia a la línea del fichero PHP donde se ha producido. Esto para mi no es aceptable en una web en producción, pero tampoco es aceptable renunciar a tener el log de errores para salvarnos de más de un apuro.

<?php if (ENVIRONMENT == 'development'): ?>
<div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;">
    <h4>A PHP Error was encountered</h4>
    <p>Severity: <?php echo $severity; ?></p>
    <p>Message:  <?php echo $message; ?></p>
    <p>Filename: <?php echo $filepath; ?></p>
    <p>Line Number: <?php echo $line; ?></p>
</div>
<?php endif; ?>

¿Solución? Irnos al fichero error_php.php y poner un if para habilitarlo solo en los entornos que consideremos oportunos. Así, ese error no aparecerá en producción y seguiremos pudiendo encontrar indeseables bugs en producción gracias al log del servidor Web.

Espero que sea de ayuda, ya que no he sido capaz de encontrar ningún recurso al respecto en google.