0
PHP에서 TCL 스크립트를 호출하고 있습니다. 스크립트가 끝났는지 확인하기 위해 TCL 프로세스에서 PHP에 고유 한 문자열을 보내고 있습니다.fread에 대한 시간 초과
그 문자열을 보내지 않으면 PHP의 내 fread가 영원히 차단됩니다.
// PHP 코드
<?php
$id = 'done'; //Unique string
$app = 'c:/wamp/www/tcl/bin/tclsh84.exe';
$descriptorspec = array(
0 => array("pipe","r"),
1 => array("pipe","w"),
2 => array("pipe","w")
) ;
$process = proc_open($app, $descriptorspec, $pipes);
if (is_resource($process))
{
for($i=0;$i<2;$i++)
{
$output = '';
$continue = true;
$cTimeout = 0;
echo 'loop ', $i, "\n";
fwrite($pipes[0], "source c:/wamp/www/tcl/bin/helloworld.tcl\n");
echo "waiting for idle\n";
$timeout = time();
do {
$read=array($pipes[1]);
$write=array();
$except=array($pipes[1]);
$ready = stream_select($read, $write, $except, 1, 0);
$dif = time()- $timeout;
if ($ready && $read)
{
$output .= fread($pipes[1], 2048); // is blocked indefinitely
// if the delimiter id shows up in $output
if (false!==strpos($output, $id)) {
// the script is done
$continue = false;
}
}
if($dif > 5) //timeout value not working
{
$continue = false;
}
} while($continue);
echo 'loop ', $i, "$output finished\n";
}
proc_close($process);
}
?>
// TCL 코드
박았 "안녕하세요"내가 TCL에서 "완료"보내는 경우
, 다음 내 PHP 스크립트가 종료됩니다. 하지만 그냥 보내고 싶지 않아 대신 시간 초과로 도움이 필요합니다. 즉, 고유 한 문자열에 대해 일정 시간 동안 기다려야합니다. 그렇지 않으면 종료해야합니다. 하지만이 경우 타임 아웃을 구현하는 것처럼 보이지 않습니다.
제발 누구든지 나를 안내 할 수 있습니다.
하지만 스크립트 실패의 경우입니다. 하지만 내 스크립트에서 버퍼에 데이터가 없으므로 fread가 차단됩니다. 그러므로 그것은 나올 수 없다. 스크립트는 tclsh 프로세스를 종료 할 때만 종료됩니다. – Vidya
실행 시간이 끝나면 실패합니다. PHP가 TLC에서 대기하는 시간을 미리 정의한 후에 종료하지 않습니까? – Frankie