Vale, no soy ningún gurú de PHP, pero, me gustaría comentar algo que vengo notando en la mayoría de sistemas que pruebo. ¿Cómo? ¿Pero es que me dedico a probar sistemas o qué? Pues así es. De vez en cuando me da por visitar Source Forge, explorar las aplicaciones o sistemas que me encuentro, filtrados por lenguajes, en este caso PHP, pero pudieran ser otros. Qué quieres que te diga, considero que echar un vistazo al código de los demás puede enseñarte cosas, ¡y además es divertido!
Pero hablemos de los reportes de errores en PHP", o del "nivel" de estos, dicho de otro modo. Como sabes, si has programado en PHP, es posible establecer el nivel de reporte de errores, gracias a funciones como "error_reporting()", entre otras. Yo, que he tenido buenos maestros (en el ClubDelphi) he aprendido que cuando probamos una aplicación, cuando trabajamos en ella, deberían mostrarse todos los errores, incluyendo los meramente "informativos": todos los errores significa eso mismo, cuantos más mejor, porque siempre podrá hacerse algo al respecto.
Sin embargo, cuando una aplicación o sistema pasa a "producción", es decir, lo subimos a un servidor de modo que dicho sistema quede disponible públicamente, en este caso, la opción sensata parece ser justamente la contraria: no mostrar en absoluto ningún error, ni siquiera los meramente informativos, puesto que estos, entre otras cosas, pueden mostrar información que ciertas personas podrían utilizar para ir en contra de la propia aplicación. Por ejemplo, un mensaje de error suele contener rutas del sistema de archivos, nombres de "scripts", etc. Todo esto interesa mantenerse oculto, repito, cuando nuestra aplicación está ya en "producción".
Personalmente, desde hace tiempo utilizo una sencilla función que establece el nivel de reporte de errores de PHP dependiendo de si el servidor es "local" (127.0.0.1) o no lo es. En el primer caso, la función se encarga de que PHP muestre todos los errores, advertencias, "noticias", que pudieran aparecer en un momento dado. Y, en caso de que la aplicación "corra" en un servidor distinto del "local", la misma función se encarga de establecer el nivel de reporte de errores de manera tal que no se muestra ninguno en absoluto. Hay que tener en cuenta que, en caso necesario, PHP provee de lo necesario para que nosotros nos enteremos de los errores, pero estos sigan sin mostrarse al usuario final.
El caso es que en varios sistemas que he probado, y aún más que me he puesto a utilizar, por ejemplo, MediaWiki, o PhpBB, el nivel de reportes de errores se establece sin tener en cuenta si la aplicación se ejecuta en "local" o en otro servidor. De este modo, me he encontrado conque algunos errores que deberían aparecer cuando estamos trabajando en "local", no aparecen, y otros errores, que no deberían aparecer cuando estamos ya en un servidor, aparecen. No se dilucida dónde se ejecuta la aplicación, y además es tarea de uno encargarse de establecer el reporte de error en cada caso, o conformarse con el establecido de forma predeterminada.
Es el momento, claro, de utilizar la función que digo que vengo utilizando para estos menesteres en mis proyectos, incluyéndola y usándola en los proyectos que me dispongo a probar o que ya estoy utilizando. Y me pregunto, cada vez que tengo que hacer esto, cómo es que a nadie se le ocurrió antes hacerlo del mismo modo. Cómo es que quien programó el sistema X prefirió ocultar errores en "local", y mostrarlos en otros servidores, o no mostrarlos nunca en todo caso, o mostrarlos siempre sea donde sea. De acuerdo que tiene que haber soluciones mucho más elaboradas, pero, ¿es tan complicado utilizar algo como esto?
function SetErrorLevel(){ if($_SERVER['SERVER_ADDR'] != '127.0.0.1'){ error_reporting(0); ini_set('display_errors', 0); ini_set('error_reporting', 0); }else{ error_reporting(E_ALL); ini_set('display_errors', 1); ini_set('error_reporting', E_ALL); } return true; }
Tan sólo con usar esta función, como vengo haciendo en proyectos propios y ajenos (en este último caso porque alguien no lo hizo antes) evitaremos mostrar errores que, al fin y al cabo, no servirán de mucho a los usuarios de nuestra aplicación, si bien entenderán que algo ha ido mal. Sino que también estaremos "forzando" a que, mientras trabajemos en "local", el nivel de reporte de errores sea el más estricto posible (en realidad todavía podría irse un poco más allá con la constante "E_STRICT") y no nos perdamos en la inopia sin que nuestra aplicación muestre reporte de error alguno, justamente, cuando estamos en disposición de arreglar los que pudieran surgir.
Publicada el Lunes, 26/5/2008 por David Esperalta
Suscribirse a esta entrada - URL para Trackbacks
Hola, no se pero creo que mi ini_set() no funciona porque no me cambia en nada sean cual sean los valores que cambie, si coloco '0' o coloco e_all, me sigue mostrando los errores. lo que quiero es ver si tengo que configurar otra cosa porque no funcionan esas funciones. pd: mi sitio está en un hosting.
Observa que se ejecuta "error_reporting()", y luego dos veces "init_set()". Si lo haces así, y no te funciona, igual tiene que ver con el servidor en que alojas la página. Ahora mismo no sabría decirte otra cosa. ¿Revisaste el manual de PHP respecto de estas funciones? Yo lo haría despacio en tu caso.