2009-11-03 43 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

你必須重新考慮你的程序的邏輯,但你可以:

  1. 註冊的關閉函數(如PHP是即將退出運行該功能)
  2. 設置最長執行時間-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 2009-11-03 11:31:26

+0

因爲執行時間過長而失敗。在TLC等待預定義的時間之後,PHP是否會退出? – Frankie 2009-11-03 11:56:05