2012-03-20 4 views
3

브라우저에서 지속적인/실시간 피드백을 제공하면서 PHP에서 쉘 스크립트를 어떻게 실행합니까? 나는 system 기능 문서에서 이해 :PHP에서 실시간 피드백으로 셸 스크립트를 실행하는 방법은 무엇입니까?

시스템() 호출은 PHP가 서버 모듈로 실행중인 경우 자동으로 출력의 각 줄 끝에서 웹 서버의 출력 버퍼를 플래시하려고합니다.

'서버 모듈'로 실행한다는 것이 확실하지 않습니다.

예 PHP 번호 :

<?php 

system('/var/lib/script_test.sh'); 

예 쉘 번호 :

#!/bin/bash 

echo "Start..." 
for i in {1..10} 
do 
     echo "$i..." 
     sleep 1 
done 
echo "Done." 

는이 기능 : 그것은 10 초 대기하는 출력 버퍼 후 세척.

원하는 작업 : 출력 할 때마다 출력 버퍼를 플러시합니다.

+0

서버 모듈 = PHP가 웹 서버 내부에 임베드되어 (예 : mod_php) 'cgi'모드로 실행되지 않습니다. –

답변

2

popen()을 사용하면 열 수있는 프로세스의 표준 출력을 처리 할 수 ​​있습니다. 데이터 청크는 ob_flush()을 사용하여 클라이언트로 전송할 수 있으며 XHR을 사용하여 데이터를 표시 할 수 있습니다.

+0

물론, 브라우저는 들어오는대로 표시 할 의무가 없습니다. 실제로 가장 좋은 방법은 아약스 폴링 또는 무언가를 사용하여 실제로 프로세스를 비 차단 방식으로 실행하는 것입니다. –

+0

@TylerEaves, 좋은 생각. 쉘 스크립트를 실행중인 PHP 페이지를로드하기 위해 AJAX 호출을 사용하고 있지만, 항상 popen()을 사용하여 플러시 할 수 있다면, 내 상황에 이상적입니다. –

+0

내가 구현 한 (PHP는 아니지만) 외부 응용 프로그램에서 작업 ID를 할당 한 다음이 jobid/message/timestamp (유닉스 정수 스타일) 구조를 가진 테이블을 구현하는 방식으로이 작업을 수행했습니다. 출력의 각 라인/그룹에 대해 메시지 테이블에 삽입합니다. 초마다 (인트라넷 앱이므로 대기 시간이 적음). 나는 아약스를 통해 폴링하여 작업 ID와 처리 된 마지막 메시지의 타임 스탬프를 전달하고 json 배열의 타임 스탬프와 텍스트를 반환했습니다. 내 메시지 div 앞에 텍스트가 추가되었습니다. 끝난. 단순한. 여러 사용자가 사용할 수 있습니다. –

2

하나의 옵션은 셸 스크립트의 각 단계에서 파일의 위치를 ​​말합니다. 웹 페이지에서 X 초/분마다 ajax 호출을 사용하십시오. ajax 호출은 상태 파일을 읽는 PHP 스크립트를 호출하고 상태 또는 완료된 단계를 반환합니다.

이 접근법의 장점은 실제로 쉘 스크립트를 시작한 페이지가 아닌 여러 방문자가 페이지 라이브 정보를 사용할 수 있다는 것입니다. 분명히 그것은 당신의 필요에 따라 바람직하지 않을 수도 있습니다.

물론 단점은 아약스 간격이 길어질수록 업데이트가 오래 될 것입니다.

+0

파일이 중복되어 popen이 존재하고 표준 처리기가있는 이유입니다. – rook

+0

popen 대신 파일 액세스가 필요한 상황에는 크로스 스크립트 체인, 실시간 데이터 피드, xhr 결과 브로드 캐스팅이 포함되지만 이에 국한되지는 않습니다. –

관련 문제