首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Libevent超时循环退出

Libevent超时循环退出
EN

Stack Overflow用户
提问于 2012-02-05 22:21:40
回答 1查看 1.1K关注 0票数 0

让PHP libevent扩展在超时时跳出循环有些困难。以下是迄今为止我在PHP.net文档页面上获得的演示:

代码语言:javascript
复制
// 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_*函数,这些函数确实存在于我的系统中,但是它们根本没有文档。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-12 06:03:17

中的fgets()中存在问题:

代码语言:javascript
复制
printf("Received event: %s after %s\n%s", implode(getEventFlags($events)), getTimer(), fgets($fd));

这会阻塞处理并等待来自STDIN的数据(但没有超时)

更改为这样的内容:

代码语言:javascript
复制
$text = '';
if ($events & EV_READ) {
    $text = fgets($fd);
}
printf("Received event: %s after %s\n%s", implode(getEventFlags($events)), getTimer(), $text);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9149969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档