2011-06-22 8 views
11

Estoy ejecutando la CLI de PHP a través de NSTask en MacOS, pero esta pregunta es más acerca de la propia CLI.PHP CLI no utiliza stderr para los errores de salida

estoy escuchando la tubería stderr, pero nada se emite allí no importa qué archivo trato de ejecutar:

  • Si el tipo de archivo no es un texto plano, stdout sets a ?.
  • Si el archivo es un script php con errores, los mensajes de error se siguen imprimiendo en stdout.

¿Hay un cambio al intérprete para manejar los errores a través de stderr? ¿Tengo una opción para detectar errores que no sean el análisis stdout?

Respuesta

18

El display_errors directive (se puede configurar en todas partes) lleva opcionalmente el parámetro "stderr" para ello para informar errores stderr en lugar de stdout o error de salida completamente desactivado. Citando a partir de la entrada manual de PHP:

Valor "stderr" envía los errores a stderr en lugar de la salida estándar . El valor está disponible a partir de PHP 5.2.4.

Alternativamente, si usted está utilizando la interfaz de línea de comandos y que desea dar salida a los errores de su propio puede volver a utilizar el command-line nput/output streams:

fwrite(STDERR, 'error message'); 

Aquí STDERR es un stream abierta hacia stderr .

Alternativamente, si desea hacerlo solo para este script y no en CLI, puede abrir un manejador de archivos en php://stderr y escribir allí los mensajes de error.

$fe = fopen('php://stderr', 'w'); 
fwrite($fe, 'error message'); 
9

Si desea que los mensajes de error enviados por el intérprete PHP debe ir a la stderr -pipe, debe establecer display_errors a stderr

1

También puede utilizar file_put_contents() con "php: // stderr" a la salida de error estándar, como:

php -r 'file_put_contents("php://stderr", "Hiya, PHP!\n"); echo "Bye!\n";' 1>/dev/null 

que da salida a "Hiya, PHP \ n "al error estándar y nada a la salida estándar cuando se ejecuta en un shell Bash.

1

Esto es necesario para volver desde el dominio de PHP al entorno del shell para poder analizar correctamente el mensaje de error. Aún necesita salir (1) o cualquier número entero para devolver el código de estado de salida de PHP a shell.

fwrite(STDERR, 'error message'); //output message into 2> buffer 
exit(0x0a); //return error status code to shell 

Entonces, su entrada en el crontab se verá así:

30 3 * * * /usr/bin/php /full/path/to/phpFile.php >> /logdir/fullpath/journal.log 2>> /logdir/fullpath/error_journal.log 
Cuestiones relacionadas