PHP Conference Japan 2024

周期性观察器操作模式

EvPeriodic 观察器根据 offsetintervalreschedule_cb 参数以不同的模式工作。

  1. 绝对计时器。在此模式下,interval = 0reschedule_cb = null。此计时器仅在挂钟时间 offset 处触发,并且不重复。它不会在发生时间跳跃时进行调整,也就是说,如果它要在2014 年 1 月 1 日运行,那么当系统时间达到或超过此时间时它将运行。

  2. 重复间隔计时器。在此模式下,interval > 0reschedule_cb = null;观察器将始终安排在下一个 offset + N * interval 时间(对于某个整数 N)超时,然后重复,而不管任何时间跳跃。

    这可用于创建相对于系统时间不漂移的计时器。

    <?php
    $hourly
    = EvPeriodic(0, 3600, NULL, function () {
    echo
    "每小时一次\n";
    });
    ?>
    这并不意味着触发之间总是会有 3600 秒,而仅仅意味着当系统时间显示完整的小时(UTC)时将调用回调。

    EvPeriodic 将尝试在此模式下在下一个可能的时间运行回调,其中 time = offsetmod interval),而不管任何时间跳跃。

  3. 手动重新安排模式。在此模式下,reschedule_cb 是一个 callable

    intervaloffset 都被忽略。相反,每次周期性观察器被调度时,重新调度回调(reschedule_cb)将被调用,观察器作为第一个参数,当前时间作为第二个参数。

    此回调绝不能停止或销毁此或任何其他周期性观察器,并且绝不能调用任何事件循环函数或方法。要停止它,请返回 1e30 并在之后停止它。一个 EvPrepare 观察器可用于此任务。

    它必须根据传递的时间值(即大于或等于第二个参数的最低时间值)返回下一个触发时间。它通常会在回调触发之前被调用,但也可能在其他时间被调用。

    示例 #1 使用重新调度回调

    <?php
    // 每 10.5 秒滴答一次

    function reschedule_cb ($watcher, $now) {
    return
    $now + (10.5. - fmod($now, 10.5));
    }

    $w = new EvPeriodic(0., 0., "reschedule_cb", function ($w, $revents) {
    echo
    time(), PHP_EOL;
    });

    Ev::run();
    ?>
添加注释

用户贡献的注释

此页面没有用户贡献的注释。
To Top