Пишете в стандартный ввод из PHP? - PullRequest
6 голосов
/ 26 марта 2011

В Linux я хочу запустить окно прогресса гнома zenity из PHP. Как работает zenity:

linux-shell$ zenity --display 0:1 --progress --text='Backing up' --percentage=0
10
50
100

Итак, первая команда открывает индикатор прогресса zenity на 0 процентов. Zenity затем принимает стандартные входные числа в качестве процента индикатора выполнения (поэтому при вводе этих цифр он будет увеличиваться с 10% до 50% до 100%).

Я не могу понять, как заставить PHP печатать эти цифры, я попробовал:

exec($cmd);
echo 10;
echo 50;

И

$handle = popen( $cmd, 'w' );
fwrite( $handle, 10 );

И

$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);

Но никто из них не обновляет индикатор выполнения. Каким образом я могу имитировать влияние stdin на оболочку linux, чтобы zenity обновил свой индикатор выполнения?

1 Ответ

6 голосов
/ 26 марта 2011

Ваш первый выполняет команду с копией стандартного ввода текущего скрипта, а не с текстом, который вы предоставляете.

Ваш второй сбой, потому что вы забыли перевод строки.Попробуйте fwrite($handle, "10\n") вместо этого.Обратите внимание, что при достижении EOF zenity достигает 100% (например, неявным закрытием $handle в конце вашего скрипта PHP).

Ваш третий сбой, потому что вы забыли перевод строкипишет не в ту трубу.Вместо этого попробуйте fwrite($pipes[0], "10\n") и запомните ту же заметку относительно EOF, что и выше.

...