2009-11-03 4 views
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 스크립트가 종료됩니다. 하지만 그냥 보내고 싶지 않아 대신 시간 초과로 도움이 필요합니다. 즉, 고유 한 문자열에 대해 일정 시간 동안 기다려야합니다. 그렇지 않으면 종료해야합니다. 하지만이 경우 타임 아웃을 구현하는 것처럼 보이지 않습니다.

제발 누구든지 나를 안내 할 수 있습니다.

답변

0

당신은 당신의 프로그램의 논리를 다시 생각해야하지만 당신은 할 수 있습니다 :

  • 는 최대 실행 시간을 설정합니다 (PHP가 실행에게 해당 기능을 종료 약처럼)

    1. 이 종료하는 기능을 등록

    을 -Limit 그리고 스크립트는이

    // sets the maximum execution time (seconds) 
    set_time_limit(3); 
    
    function shutdown() { 
        // if the script fails some logic goes here 
    } 
    
    // registers the function to run on shutdown 
    register_shutdown_function('shutdown'); 
    

    이해야처럼 갈 것 올바른 방향으로 설정하십시오.

    희망이 있습니다.

  • +0

    하지만 스크립트 실패의 경우입니다. 하지만 내 스크립트에서 버퍼에 데이터가 없으므로 fread가 차단됩니다. 그러므로 그것은 나올 수 없다. 스크립트는 tclsh 프로세스를 종료 할 때만 종료됩니다. – Vidya

    +0

    실행 시간이 끝나면 실패합니다. PHP가 TLC에서 대기하는 시간을 미리 정의한 후에 종료하지 않습니까? – Frankie