procesos proceso funcion execve execlp ejemplos php

proceso - Suprimiendo la salida de las llamadas exec() en PHP



proceso fork linux (4)

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

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

¡Espero que ayude!

Tengo una serie de scripts de línea de comandos en PHP que usan exec() para realizar tareas como reiniciar servicios, cargar archivos de zona horaria de MySQL, etc. están forzando una salida que parece que no puedo suprimir (incluso con ob_start () / ob_end_clean ()). Por ejemplo, lo siguiente cargaría archivos de zona horaria en MySQL. Ejecutamos esto periódicamente para asegurarnos de que los datos de la zona horaria de MySQL estén actualizados:

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

En este ejemplo, esperaría que toda la salida del comando se escribiera en $ output, pero aún así obtengo 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 por adelantado,
~ James Armes


La redirección de stderr solo no debe influir en el lugar en el que se realiza el procesamiento, solo asegúrese de no agregar un & . Solo debería ejecutarse en segundo plano si redirecciona la salida y la ejecuta en segundo plano.

Editar:

Cygwin abierto y roto, necesita redirigir stderr para el primer comando, intente esto:

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


Redirigir a / dev / null no hace que PHP deje de esperar el comando. Si agrega un & hace esto, probablemente asocie los dos porque el final & menudo se usa junto con una redirección.

En respuesta al comentario (eliminado) de Yannick: parece que si quiere ejecutar algo en segundo plano en PHP, debe redirigir y usar & . Esto no significa que la sola redirección haga que se ejecute en segundo plano.


Solo redirigir stderr a /dev/null

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

o al stdout

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