martes, 15 de febrero de 2011

Generar la salida de error en un script PHP


La salida de un script PHP lo normal es que sea en la salida estándar, que es donde se vuelca la información para que sea recogida por el cliente de turno. Esto suele hacerse mediante las sentencias echo y print que siempre imprimen en la salida estándar, pero ¿y si quiero enviar un mensaje a la salida de error?.


Cuando programamos nuestros scripts de linea de comandos surge la cuestión de necesitar trabajar con el resto de canales de entrada y salida que define el sistema. De los canales definidos en el sistema como salida tenemos dos, la salida estándar (stdout) y la salida de errores (stderr). Son dos canales distintos por donde se puede volcar la salida de un script, y por lo tanto nos puede interesar poder especificar porque canal quiero mandar la información. Lógicamente la salida estándar será para los mensajes de proceso y la de error para mensajes que indiquen un comportamiento anómalo al proceso.


Para esto PHP define una serie de secuencias de entrada y salida para poder utilizar con las funciones de tratamiento de ficheros, y que nos permite tratar información sobre los canales del sistema. Sobre los canales de salida que nos interesan están php://stdout y php://stderr que son los que ofrecen acceso al canal de salida estándar y de error respectivamente. Estos canales están definidos en unas constantes (STDOUT y STDERR) que definen el descriptor de cada canal, y que permiten trabajar con ellos usando directamente las funciones de escritura…



fwrite(STDOUT, "Conectando a servidor");

fwrite(STDERR, "ERROR: No se pudo acceder al recurso");


Al utilizar la constante STDERR como descriptor de fichero en la función de escritura, todos los mensajes que se escriban saldrán por el canal de error.


Así en nuestro scripts podremos diferenciar este canal…



php -q script.php 2> /var/log/script/script_php.error.log


Diferencias entre entornos


Para ejecutar un script de PHP podemos tener el intérprete compilado de dos formas diferentes: CGI y CLI


CLI


PHP actúa como si fuera un script de linea de comando. Es la versión que se tiene en el entorno de desarrollo, y sería la opción más adecuada para lanzar los scripts que se programan como tareas en el sistema.


No tiene asociada ninguna excepción sobre lo que hemos visto.


CGI


Integrado en los entornos de test y producción.


Usado antiguamente (y puede que actualmente) como el interprete que se configuraba en los servidores web para poder integrar PHP. Esta versión esta más orientada a ejecutar scripts en un entorno web, y no desde linea de comando como suelen ser nuestro caso. Es por esto que existen diferencias con la versión CLI y en este caso con los descriptores de ficheros.


No existen las constantes que representan los canales de salida STDOUT y STDERR, y por lo tanto hay que realizar la escritura de otra manera…



$fd_err = fopen("php://stderr","w"):

fwrite($fd_err, "ERROR: No se pudo acceder al recurso");


… para poder trabajar con la secuencia de error.


Solución


Para no tener que escribir código diferente entre las versiones se puede definir las constantes para que el trabajo sea igual y quede como si no hubiera diferencia…



if(!defined('STDERR')) define('STDERR', fopen("php://stderr","w"));

fwrite(STDERR, "ERROR: No se pudo acceder al recurso");


… así, si la constante no está definida se creara, y nuestro código quedaría igual para los diferentes entornos.

No hay comentarios:

Publicar un comentario