2011-03-26 69 views
6

在linux中,我想从PHP运行一个gnome zenity进度条窗口。如何zenity的工作原理是这样的:从PHP写入stdin?

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

所以第一个命令在0%的打开zenity进度条。然后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 shell上的效果以获得更新其进度条的灵活性?

回答

6

您的第一个命令将执行当前脚本的stdin副本,而不是您提供的文本。

你的第二次失败,因为你忘记了换行符。改为尝试fwrite($handle, "10\n")。请注意,当达到EOF时,zenity似乎会跳到100%(例如,通过在PHP脚本末尾隐式关闭$handle)。

你的第三次失败是因为你忘记了换行符而且你正在写入错误的管道。改为尝试fwrite($pipes[0], "10\n"),并记住与上述EOF相同的注释。

+0

非常感谢!不能相信我忘了换行符! :) – hamstar 2011-03-26 22:04:50