2012-02-05 8 views
0

PHP libevent 확장이 제한 시간에 루프를 벗어나는 데 어려움을 겪고 있습니다.Libevent timeout loop exit

// 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에 전달 된 이벤트를 통과 것을 볼 수있다) 이러한 이벤트는, 경우 : 여기가 PHP.net의 문서 페이지의 데모를 기반으로 지금까지있어 무엇 2 초 이상 차이가 나면 EV_READ 대신 EV_TIMEOUT이 표시됩니다. 그러나 내가 원하는 것은 libevent가 print_line으로 전화를 걸면 다음 이벤트를 기다리는 대신 타임 아웃에 도달하자마자 타임 아웃을 제공하는 것입니다.

event_base_loopexit($base, 2000000)을 사용해 보았습니다. 이로 인해 이벤트 루프가 이벤트를 차단하지 않고 즉시 종료됩니다. 나도 EV_TIMEOUTevent_set에 건네 봤지만 아무런 효과가없는 것 같습니다.

누구든지 이전에이 기능을 사용할 수 있었습니까? event_buffer_ * 물건이 타임 아웃과 함께 작동하지만, 표준 event_base 함수를 사용하고 싶습니다. event_timer_ * 함수에 관한 PECL bugs 대화 중 하나는 내 시스템에 존재하지만 전혀 문서화되지 않았습니다.

답변

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