2012-02-05 108 views
0

我有一些困難讓PHP libevent擴展突破循環超時。這是我到目前爲止已經有基於在PHP.net文檔頁面演示:Libevent超時循環退出

// From here: http://www.php.net/manual/en/libevent.examples.php 

function print_line($fd, $events, $arg) { 
    static $max_requests = 0; 
    $max_requests++; 

    printf("Received event: %s after %s\n%s", implode(getEventFlags($events)), getTimer(), fgets($fd)); 

    if ($max_requests == 10) { 
     // exit loop after 3 writes 
     echo " [EXIT]\n"; 
     event_base_loopexit($arg[1]); 
    } 
} 

// create base and event 
$base = event_base_new(); 
$event = event_new(); 


getTimer(); // Initialise time 

$fd = STDIN; 
event_set($event, $fd, EV_READ | EV_PERSIST, "print_line", array($event, $base)); 
event_base_set($event, $base); 
event_add($event, 2000000); 
event_base_loop($base); 

// extract flags from bitmask 
function getEventFlags ($ebm) { 
    $expFlags = array('EV_TIMEOUT', 'EV_SIGNAL', 'EV_READ', 'EV_WRITE', 'EV_PERSIST'); 
    $ret = array(); 
    foreach ($expFlags as $exf) { 
     if ($ebm & constant($exf)) { 
      $ret[] = $exf; 
     } 
    } 
    return $ret; 
} 

// Used to track time! 
function getTimer() { 
    static $ts; 
    if (is_null($ts)) { 
     $ts = microtime(true); 
     return "Timer initialised"; 
    } 
    $newts = microtime(true); 
    $r = sprintf("Delta: %.3f", $newts - $ts); 
    $ts = $newts; 
    return $r; 
} 

我可以看到,超時值傳遞給event_add效果傳遞給print_line(事件),如果這些事件任何時間間隔超過2秒,我會得到一個EV_TIMEOUT而不是EV_READ。然而,我想要的是libevent在達到超時時間後立即致電print_line,而不是等待下一個事件以便給我超時。

我試過使用event_base_loopexit($base, 2000000),這會導致事件循環立即退出而不會阻塞事件。我也試過EV_TIMEOUTevent_set,這似乎沒有任何效果。

有沒有人設法讓它工作?我知道event_buffer_ *的東西與超時工作,但我想使用標準event_base函數。其中一個PECL bugs討論event_timer_ *函數,這些函數確實存在於我的系統中,但它們根本沒有記錄。

回答

0

問題是在與fgets()中:

printf("Received event: %s after %s\n%s", implode(getEventFlags($events)), getTimer(), fgets($fd)); 

該塊的處理和用於從STDIN數據等待(但也有沒有對超時)

切換到類似的東西:

$text = ''; 
if ($events & EV_READ) { 
    $text = fgets($fd); 
} 
printf("Received event: %s after %s\n%s", implode(getEventFlags($events)), getTimer(), $text); 
+0

謝謝,這工作正常。 – Robin 2012-03-18 18:48:55