2011-03-26 6 views
6

linux에서 나는 PHP로부터 그놈 (gnome zenity) 진행 바 창을 실행하고 싶다. zenity가 작동하는 방식은 다음과 같습니다.PHP에서 stdin에 쓰기?

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

을 그러나 그들 중 누구도 진행률 표시 줄을 업데이트하지 않습니다. 어떤 점에서 Linux 쉘에서 stdin의 효과를 모방하여 진행률 표시 줄을 업데이트 할 수 있습니까?

답변

6

첫 번째 명령은 사용자가 입력 한 텍스트가 아니라 현재 스크립트의 표준 입력란의 복사본으로 명령을 실행합니다.

줄 바꿈을 잊어 버리기 때문에 초를 실패합니다. 대신 fwrite($handle, "10\n")을 사용해보세요. EOF에 도달하면 (예 : PHP 스크립트의 마지막에 $handle의 암시 적 종료로) zenity가 100 %로 점프하는 것으로 보입니다.

새 행을 잊어 버리고 잘못된 파이프에 쓰고 있기 때문에 세 번째 오류가 발생합니다. 대신 fwrite($pipes[0], "10\n")을 시도하고 위의 EOF와 동일한 메모를 기억하십시오.

+0

감사합니다. 내가 개행을 잊어 버린 것을 믿을 수 없다! :) – hamstar