2009-11-03 2 views
0

Я вызываю скрипт TCL из PHP. Я отправляю уникальную строку из процесса TCL в PHP, чтобы убедиться, что скрипт закончился.timeout for fread

Если я не отправляю эту строку, то мой fread в PHP блокируется навсегда.

// 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 скрипт завершается. Но я не хочу, чтобы отправить только что сделано, вместо этого мне нужно сделать с помощью тайм-аута. i.e Я хочу подождать определенный период времени для уникальной строки, иначе я должен выйти. Но я не могу реализовать таймаут в этом случае.

Прошу, чтобы кто-нибудь мог меня вести.

ответ

0

Вам придется пересмотреть логику вашей программы, но вы можете:

  1. Регистрирует функцию для отключения (как PHP собирается бросить пробегов эту функцию)
  2. Установите максимальное время выполнения- -предела

И ваш сценарий будет идти, как этот

// 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