¿Escribir en stdin desde PHP?
Pregunta
En Linux quiero ejecutar una ventana de la barra de progreso de gnome zenity desde PHP.El funcionamiento de zenity es así:
linux-shell$ zenity --display 0:1 --progress --text='Backing up' --percentage=0
10
50
100
Entonces, el primer comando abre la barra de progreso de zenity al 0 por ciento.Luego, Zenity toma los números de entrada estándar como porcentaje de la barra de progreso (por lo que pasará del 10% al 50% y al 100% cuando escriba esos números).
Sin embargo, no puedo entender cómo hacer que PHP escriba esos números, lo he intentado:
exec($cmd);
echo 10;
echo 50;
Y:
$handle = popen( $cmd, 'w' );
fwrite( $handle, 10 );
Y:
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w") // stdout is a pipe that the child will write to
);
$h = proc_open($cmd, $descriptorspec, $pipes);
fwrite($pipes[1], 10);
Pero ninguno de ellos actualiza la barra de progreso.¿De qué manera puedo imitar el efecto de la entrada estándar en el shell de Linux para que zenity actualice su barra de progreso?
Solución
Primero ejecuta el comando con una copia de la entrada estándar del script actual, no el texto que proporciona.
Tu segundo falla porque estás olvidando la nueva línea.Intentar fwrite($handle, "10\n")
en cambio.Tenga en cuenta que la zenidad parece saltar al 100 % cuando se alcanza el EOF (p. ej.por el cierre implícito de $handle
al final de su script PHP).
El tercero falla porque olvida la nueva línea y escribe en la canalización incorrecta.Intentar fwrite($pipes[0], "10\n")
en su lugar, y recuerde la misma nota sobre EOF que se mencionó anteriormente.