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_TIMEOUT
到event_set
,這似乎沒有任何效果。
有沒有人設法讓它工作?我知道event_buffer_ *的東西與超時工作,但我想使用標準event_base
函數。其中一個PECL bugs討論event_timer_ *函數,這些函數確實存在於我的系統中,但它們根本沒有記錄。
謝謝,這工作正常。 – Robin 2012-03-18 18:48:55