2009-10-22 17 views
19

Tengo un número de scripts de línea de comandos en PHP que usan exec() para realizar tareas tales como reiniciar servicios, cargar archivos de zona horaria MySQL, etc. Mientras que exec() no da salida a nada En la pantalla, algunos de los comandos que estoy ejecutando están forzando la salida que no puedo suprimir (incluso con ob_start()/ob_end_clean()). Por ejemplo, lo siguiente cargaría archivos de zona horaria en MySQL. Corremos esto periódicamente para que los datos seguros MySQLs zona horaria es hasta la fecha:Suprimir el resultado de las llamadas exec() en PHP

$command = 'mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql'; 
exec($command, $output, $result); 

En este ejemplo, yo esperaría toda la salida de la orden para ser escrito en la salida $, pero aún así obtener la siguiente salida forzada a la pantalla:

Warning: Unable to load '/usr/share/zoneinfo/Asia/Riyadh87' as time zone. Skipping it. 
Warning: Unable to load '/usr/share/zoneinfo/Asia/Riyadh88' as time zone. Skipping it. 
Warning: Unable to load '/usr/share/zoneinfo/Asia/Riyadh89' as time zone. Skipping it. 
... 

¿Hay alguna manera de suprimir esta salida? Redirigir a/dev/null no es ideal ya que eso haría que PHP continúe procesando sin esperar a que se complete el comando.

Gracias de antemano,
~ JamesArmes

+2

Para aquellos que se preguntan por qué el código de ejemplo no funciona, es porque solo 'stdout' es capturado. Los errores dados se escriben en 'stderr', que no se captura, sino que se vuelca a la pantalla. – etheros

+1

Vine a este hilo a través de google buscando una manera de suprimir todos los resultados cuando se ejecuta una secuencia de comandos PHP CLI. Mi solución fue envolver la llamada 'exec()' en 'ob_start()' y 'ob_end_clean()'. –

Respuesta

21

Redirección stderr por sí sola no debe influir en lugar de transformación, sólo asegúrese de no añadir una &. Solo debe ejecutarse en segundo plano si redirige la salida y la ejecuta en segundo plano.

Editar:

agrietada cygwin abierta, es necesario redirigir stderr para el primer comando, le daría prueba:

$command = 'mysql_tzinfo_to_sql /usr/share/zoneinfo 2> /dev/null | mysql mysql'; 
exec($command, $output, $result); 
+0

Esto no es del todo cierto. El manual de PHP significa que si simplemente usas '&' sin redirección, PHP aún se bloqueará. La redirección sola todavía no hace que se ejecute en segundo plano. –

+0

De hecho, eso parece más plausible. Corregiré mi respuesta –

+0

Redireccionando usando $ command = 'mysql_tzinfo_to_sql/usr/share/zoneinfo | mysql mysql 2>/dev/null '; sigue causando el mismo resultado. Sin embargo, llamando a mi script como php mysql_timezones.php 2>/dev/null suprime correctamente la salida. ¿Es posible obtener los mismos resultados sin llamar a mi script de esa manera? – JamesArmes

6

Sólo redirigir stderr a /dev/null

$command = 'mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql 2>/dev/null'; 

oa stdout

$command = 'mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql 2>&1'; 
+0

Eso solo funciona en * nix – felixfbecker

2

Redireccionando a/dev/null hace no causa que PHP deje de esperar el comando. Agregar un &hace hacer esto, probablemente asocie los dos porque el & final se usa a menudo junto con un redireccionamiento.

En respuesta al comentario de Yannick (suprimido): Parece que si desea ejecutar algo en el fondo en PHP, usted debe redirigir así como el uso &. Esto no significa que solo la redirección haga que se ejecute en segundo plano.

+0

Según el manual de PHP "Si un programa se inicia con esta función, para que continúe ejecutándose en segundo plano, la salida del programa debe redirigirse a un archivo u otra secuencia de salida. De lo contrario, PHP se bloqueará hasta que finalice la ejecución del programa ". Aunque parece que es correcto, PHP requiere tanto una redirección como el operador de fondo & – JamesArmes

+0

JamesArmes: eso es precisamente lo que la 2da parte de mi respuesta tenía la intención de explicar –

0

De acuerdo con http://us3.php.net/manual/en/function.shell-exec.php puede asignar la salida de este comando a una variable.

No tiene que hacer necesariamente nada con la variable, lo que significa que efectivamente está suprimiendo la salida.

Espero que ayude!

+0

Eso es lo que se supone que la variable $ output en la llamada exec() do (se pasa por referencia). He intentado usar shell_exec() y produce los mismos resultados. – JamesArmes