2013-06-14 3 views
2

PHP를 사용하여 TCL 스크립트의 출력을 파일로 캡처하고 싶습니다. 파일에 hello world 출력을 캡처 할 수 있지만 시간이 오래 걸리고 큰 출력이있는 긴 스크립트를 실행하면 나는 그렇지 않습니다.PHP를 사용하여 lscript 출력 파일을 캡처 할 수 없습니다.

<?php 
ob_start(); 
passthru(' /path/to/file/helloworld '); 
$out1 = ob_get_contents(); 
ob_end_clean(); 
$fp = fopen('/path/to/file/output.txt',w); 
fwrite($fp,$out1); 
fclose($fp); 
echo'<pre>', $out1,'</pre>'; 
#var_dump($out1); 
?> 

긴 TCL의 전대에 어떤 문제가 있는지 저를 제안하십시오

여기 내 코드입니다.

+2

체크 아웃 http://stackoverflow.com/questions/3407939/shell-exec-timeout-management-exec. 스크립트가 시간 초과되었을 수 있습니다. –

+0

헬로우 월드 스크립트에 문제가 있다는 증거는 보이지 않았습니다. "php passthru timeout"에 대한 Google 검색은 관련성이 높은 몇 가지 질문을 나타냅니다. –

답변

1

EDIT : 데몬과 같이 오래 실행되는 스크립트의 경우 popen을 사용하고 리소스에서 콘텐츠를 스트리밍하는 것이 좋습니다.

예 :

<?php 
$h = popen('./test.sh', 'r');                                       
while (($read = fread($h, 2096))) {                                     
    echo $read; 
    sleep(1);                                           
} 
pclose($h); 

당신은 "max_execution_time이라는"에 대한 php.ini 파일을 확인해야합니다. 웹 서버 컨텍스트에 있다면 구성된 시간 초과도 확인하십시오.

<?php 
$output = array(); 
exec('/path/to/file/helloworld', $output); 
file_put_contents('/path/to/file/output.txt', implode("\n", $output)); 

예 : EDIT OF

END

는 두 번째 파라미터는 스크립트 출력 짧은

가득 얻는다 배열에 대한 참조 exec

시도했다 :

test.sh :

#!/bin/bash                                           
echo -e "foo\nbar\nbaz";                                        
echo -e "1\n2\n3"; 

test.php :

<?php 

$output = array(); 
exec('./test.sh', $output); 
var_dump($output); 

출력 : PHP 공식 문서

php test.php 
array(6) { 
    [0]=> 
    string(3) "foo" 
    [1]=> 
    string(3) "bar" 
    [2]=> 
    string(3) "baz" 
    [3]=> 
    string(1) "1" 
    [4]=> 
    string(1) "2" 
    [5]=> 
    string(1) "3" 
} 

견적 (링크 위 참조)

출력 인자가 존재한다면 , 지정된 배열이 채워집니다 명령의 모든 출력 행.

+0

'exec'는 출력의 마지막 줄만 반환합니다. '패스 스루 '는이 경우에 맞습니다. (당신이 새로운 것이므로 내 downvote를 취소했습니다.) –

+0

@ acheong87 마지막 줄만 반환하지만 여기에는 반환이 저장되지 않습니다. '$ output'은 참조로 전달되고 모든 라인으로 채워집니다. –

+0

@ dev-null-dweller - 아, 죄송합니다. 예, 나는 그것을 보지 못했습니다. 나는이 사용자가 어제 동일한 질문을 올렸고,'exec'을 사용하고 있었기 때문에 누군가가'exec'에 제안했다는 결론에 이르렀다. 나는 그의 문제가 정말로 시간 초과라고 생각한다. –

관련 문제