Curso de PHP y MySQL
José Gómez Castaño
 

Errores

Para obtener información sobre los errores que se van produciendo en la ejecución de las aplicaciones, se utilizan diferentes funciones. Entre ellas las más importantes son error_get_last(), trigger_error(), error_log().

<?php
echo $a;

// devuelve un array asociativo con el tipo, mensaje, archivo y línea donde se produce un error
echo error_get_last();
?>

 

Esto produce la siguiente salida:

Array
(
[type] => 8
[message] => Undefined variable: a
[file] => C:\WWW\index.php
[line] => 2
)

<?php
if ($divisor == 0) {
    trigger_error("Cuidado, el divisor es cero", E_USER_ERROR);
}

// Envío del mensaje al syslog del sistema
if (!Ora_Logon($username, $password)) {
    error_log("La base de datos no está disponible", 0);
}

// Envío del mensaje mediante email
if (!Ora_Logon($username, $password)) {
    error_log("La base de datos no está disponible", 1,"admin@miempresa.com");
}

// Escritura en el fichero:
if (!Ora_Logon($username, $password)) {
	error_log("La base de datos no está disponible", 3, "/var/tmp/my-errors.log");
}
?>
 

Configuración ficheros de log

Los errores durante la ejecución se se muestran al usuario en función del nivel de log configurado en la variable error_reporting del fichero php.ini, además la variable display_errors debe tener el valor On. Para entornos de desarrollo el valor E_ALL & ~E_NOTICE & ~E_STRICT es adecuado para que informe de errores y alertas en tiempo de ejecución. Estos mensajes, además de aparecen en pantalla, se pueden almacenar en un fichero de log. Para ello, la variable error_log de php.ini indica la ubicación de este fichero.Si el fichero no existe la primera vez, se crea. Para entornos de producción, es recomendable deshabilitar la muestra de errores, y restringirlos a un archivo de log controlado.

Clase para la gestión de errores

Para poder gestionar de forma eficaz los errores, es posible encapsular el tratamiento de los errores en una clase, de forma que para una aplicación determinada, podamos especificar un fichero donde se almacenen los mensajes, un nivel a partir del que necesitemos almacenarlos, y definir un método con el que guardar un mensaje.

<?php
/*
	0	Desarrollo
	1	Depuración
	2	Producción
	3	Critico y se envia por correo
*/

class logar{

	var $app = "";
	var $path = "";
	var $level = 0; 
	var $emailAviso = "miemail@miempresa.com";
	
	function __construct($app, $path){
	
		if ($app){
			$this->app = $app;
		}
		if ($path){
			$this->path = $path;
		}
	}
	
	public function logmens($mens,$level){
		if ($level >= $this->level){
			error_log("[".$this->app."] ".date("d-M-Y H:i:s ").$mens."\n",3,$this->path);
		}
		if ($level >= 3){
			error_log("[".$this->app."] ".date("d-M-Y H:i:s ").$mens."\n",1,$this->emailAviso);
		}
	}

}

?>
 
En el ejemplo anterior se ha creado una clase para esta gestión. En el constructor se definirán el nombre de la aplicación, el path donde queramos guardar el fichero de log, y una dirección de correo electrónico a la que se le enviarán los mensajes cuando el nivel de aviso sea 3. A continuación se presenta un ejemplo de uso.
<?php

require_once("class.log.php");

$objLog = new logar("miApp","../logs/miApp.log");

// para almacenar el mensaje en un fichero
$objLog->logmens("Mensaje a logar",1);

// para almacenar el mensaje en un fichero y enviarlo por correo
$objLog->logmens("Mensaje a logar",3);

?>
 

Control de tiempo de ejecución

A veces es necesario controlar el tiempo de ejecución de un proceso dentro de un script. A continuación se describe una forma de llevarlo a cabo.

<?php

// antes del proceso a controlar
$starttime = microtime(TRUE);

// proceso a controlar
for ($i = 0; $i < 10000; $i++) {
  
}

// después del proceso
$endtime = microtime(TRUE) - $starttime;
echo "Ha tardado ".round($endtime,3)." segundos";

?>
 

Creative Commons License
Curso PHP y MySQL by José Gómez Castaño is licensed under a Creative Commons Reconocimiento-Compartir bajo la misma licencia 3.0 España License.
Based on a work at www.meridi.es/cursos/php.