fread超时

时间:2009-11-03 10:21:19

标签: php

我从PHP调用TCL脚本。我正在从TCL进程向PHP发送一个唯一的字符串,以确保脚本已经结束。

如果我不发送该字符串,那么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发送“done”,那么我的PHP脚本就会结束。 但是我不想发送完成,而是需要在超时的帮助下完成。 即我想等待一段特定时间的独特字符串,否则我应该退出。但在这种情况下,我似乎无法实现超时。

请任何人都可以指导我。

1 个答案:

答案 0 :(得分:0)

你必须重新考虑你的程序的逻辑,但你可以:

  1. 注册一个关闭函数(因为PHP即将退出运行该函数)
  2. 设置max execution-time-limit
  3. 你的脚本会像这样

    // 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');
    

    这应该让你朝着正确的方向前进。

    希望它有所帮助!