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_TIMEOUT
을 event_set
에 건네 봤지만 아무런 효과가없는 것 같습니다.
누구든지 이전에이 기능을 사용할 수 있었습니까? event_buffer_ * 물건이 타임 아웃과 함께 작동하지만, 표준 event_base
함수를 사용하고 싶습니다. event_timer_ * 함수에 관한 PECL bugs 대화 중 하나는 내 시스템에 존재하지만 전혀 문서화되지 않았습니다.
감사합니다. 정상적으로 작동합니다. – Robin