Credit image

¿Te gusta el diseño web? ¡Echa un vistazo a la documentación de LenguajeCSS.com!

Niveles de error en PHP

Una aplicación o código en lenguaje PHP tiene varios niveles de error (error_reporting). En este breve artículo vamos a hablar del error_reporting y sus características.

El lenguaje de programación PHP, de forma similar a otros varios lenguajes como podrían ser C++, Java u otros, tiene diferentes niveles de error.

Por lo general, los programadores estamos acostumbrados a trabajar con al menos dos niveles de error diferentes (sin llegar a desglosarlos en tiempos de ejecución o compilación):

  • Warnings: Errores que no repercuten directamente en el funcionamiento de la aplicación. Por ejemplo, pueden ser sugerencias de errores comunes, recomendaciones o detalles poco importantes que no son del todo correctos. También llamados notas o avisos.
  • Errores: Los tradicionales, algo que está mal escrito (sintaxis incorrecta) o que no funciona correctamente porque es incorrecto.

En PHP existen varios niveles de error (error_reporting), los más generales son los siguientes, por orden:

  • E_ERROR: Errores graves (fatal error) que detienen inmediatamente la ejecución del código PHP.
  • E_WARNING: Errores leves (non-fatal error) que no detienen la ejecución del código.
  • E_PARSE: Errores sintácticos de parseo.
  • E_NOTICE: Avisos o notas de sugerencias o detalles (variables no inicializadas, vacías, etc...).
  • E_ALL: Todos los anteriores.

Por defecto, en PHP el nivel de error establecido es E_ALL ^ E_NOTICE, o lo que es lo mismo, notificar todos los errores, menos los NOTICE.

Cambiar niveles de error en PHP

Estos niveles de error, podemos modificarlos de dos maneras:

  • En php.ini: Editando el fichero de configuración /etc/php.ini y cambiando la linea error_reporting por el nivel que queramos.
  • En código PHP: Escribiendo una linea del estilo error_report(E_ALL) al inicio del código.

En el fichero de configuración php.ini puedes encontrar otras opciones interesantes como display_errors (mostrar errores por salida, recomendable desactivar en producción) o log_errors (guardar errores en un fichero de registro).

Este fichero de registro, suele denominarse error_log y suele estar ubicado en la siguiente ruta: /var/log/error_log. En el se van guardando todos los errores (dentro del nivel de error actual) para una posterior revisión.

Ejemplos de errores

A continuación veamos unos cuantos ejemplos que podríamos encontrar en el fichero error_log y como solucionarlos:

[client X.X.X.X] PHP Warning: fopen(/var/www/html/filedata.txt): failed to open stream: Permission denied in /var/www/html/lectura.php on line 35

Este error de tipo warning nos avisa de un error al leer el fichero filedata.txt (en la línea 35 del script PHP) porque no tiene permisos de lectura. El error es de tipo warning (no-fatal) ya que al no poder leer el fichero, continuará con el resto del script PHP sin detenerse.

La solución está en darle permisos de lectura al fichero filedata.txt con un chmod 644 filedata.txt (por ejemplo).

[client X.X.X.X] PHP Fatal error: Allowed memory size of 65011712 bytes exhausted (tried to allocate 691200 bytes) in /var/www/html/index.php on line 150, referer: http://www.web.com/

Este error (de tipo fatal) nos está avisando de que se ha agotado el máximo de memoria permitida para la operación. En este caso, evidentemente, la ejecución del script se detiene y no puede seguir, ya que se ha agotado la memoria.

La solución estaría en aumentar el límite de memoria permitida en el fichero php.ini (en este caso está en 64Mb) u optimizar el script PHP para que utilice menos (liberando memoria, utilizando operaciones menos costosas, etc...).

[client X.X.X.X] PHP Notice: Undefined variable: var in /var/www/html/index.php on line 108, referer: http://www.web.com/

Este error (de tipo notice) nos está avisando de que se ha realizado una operación con una variable $var que no ha sido definida antes (no existe). Aún tratándose de fallos muy leves, con códigos dinámicos que se ejecutan un gran numero de veces diariamente se puede llegar a optimizar bastante el rendimiento.

La solución estaría en editar el fichero index.php y en la línea 108, en el caso de que se efectue una comprobación, cambiarla comprobando antes si existe:

Antes:

if ($var == "primero") { ... }

Después:

if ((isset($var)) && ($var == "primero")) { .... }

Notar que en este último código, comprobamos antes con la función isset si la variable existe, y como estamos evaluando en circuito corto, en el caso de no existir, no seguirá efectuando las siguientes condiciones del if.

Esto, a pesar de ser algo que parece carecer de importancia, para códigos extremadamente complejos, una simple comprobación con isset puede reducir bastante los códigos a ejecutar.

Escrito por Manz, el , en programacion. Comentarios recibidos: 3.

3 comentarios de lectores
alberto
alberto
1

Actualmente mi problema es que pienso contratar un espacio web en linux , pero yo no voy a tener acceso a los archivos de configuración.¿Hay alguno que deje hacerlo? Un saludo , muy bueno el post

Manz
Manz
2

@alberto: Sería cuestión de echar un vistazo, Hostarting es un buen lugar para empezar a mirar. Por norma general, en los servidores compartidos, los archivos de configuración no suelen poder tocarse. Eso sí, en Dreamhost puedes acceder a los archivos logs (access_log y error_log). Saludos,

Isra
Isra
3

ini_set() Además, algunos hostings permiten sobreescribir directivas de configuración de php incluyendo un archivo llamado php.ini en el mismo directorio donde quieres que se apliquen las directivas.

Publica tu opinión

Si lo deseas, puedes utilizar el siguiente formulario para publicar tu opinión o responder a alguna de las existentes:

Previsualización

Aquí se previsualizará su comentario. Revise que sea correcto antes de publicarlo.