CascadiaPHP 2024

Класс EvTimer

(PECL ev >= 0.2.0)

Введение

Наблюдатели EvTimer — обычные относительные таймеры, которые создают событие через заданное время и, опционально, периодически повторяют его через заданные интервалы времени.

Таймеры базируются на реальном времени, то есть если задать таймер с повторами раз в час и сбросить системные часы на Январь прошлого года, то таймер будет все также срабатывать через (примерно) час. «Примерно» потому, что обнаружить скачки во времени сложно, а отдельные неточности неизбежны.

Callback-функция гарантированно запустится только после того, как пройдёт превышение заданного времени ожидания (не ровно в тот же момент, т. к. на системах с часами с низким разрешением могут наблюдаться небольшие задержки). Если несколько таймеров будут готовы сработать в одну и ту же итерацию событийного цикла, то callback-функции наблюдателей будут запущены в порядке времени срабатывания и с учётом приоритета (но это не работает, если callback-функции вызывают метод EvLoop::run() рекурсивно).

Сами по себе таймеры стараются всеми силами избежать накапливания ошибки, то есть если таймер сконфигурирован срабатывать каждые 10 секунд, то обычно он срабатывает точно с 10 секундным интервалом. Однако, если скрипт не поспевает за таймером, поскольку его работа занимает более 10 секунд, то таймер сработает не чаще чем один раз за итерацию событийного цикла.

Обзор класса

class EvTimer extends EvWatcher {
/* Свойства */
public $repeat;
public $remaining;
/* Наследуемые свойства */
public $is_active;
public $data;
public $is_pending;
public $priority;
/* Методы */
public __construct(
     float $after ,
     float $repeat ,
     callable $callback ,
     mixed $data = null ,
     int $priority = 0
)
public again(): void
final public static createStopped(
     float $after ,
     float $repeat ,
     callable $callback ,
     mixed $data = null ,
     int $priority = 0
): EvTimer
public set( float $after , float $repeat ): void
/* Наследуемые методы */
public EvWatcher::feed( int $revents ): void
public EvWatcher::invoke( int $revents ): void
public EvWatcher::keepalive( bool $value = ?): bool
public EvWatcher::setCallback( callable $callback ): void
}

Свойства

repeat

Если равно 0.0, то таймер автоматически остановится, когда будет превышено время ожидания. Если больше нуля, то таймер автоматически перейдёт в режим бесконечного повторения через заданные интервалы, пока его не остановят самостоятельно.

remaining

Возвращает время, оставшееся до срабатывания таймера. Если таймер активен, то это время будет считаться относительно времени текущего событийного цикла, а если таймер неактивен, то оно будет равно сконфигурированному значению времени ожидания.

То есть, после создания экземпляра EvTimer с параметром after со значением 5.0 и параметром repeat со значением 7.0, remaining вернёт 5.0. Когда таймер запустится и пройдёт 1 секунда, remaining вернёт 4.0. Когда таймер истечёт и будет перезапущен, он вернёт «примерно» 7.0 (обычно чуть меньше, потому что запуск callback-функции занимает время) и т. д.

Содержание

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top