API: localzet\Timer

Таймеры работают в event loop текущего процесса. Их ID не глобален между workers: таймер, созданный одним worker-ом, нельзя отменить из другого.

Методы

МетодПоведение
Timer::repeat(float $seconds, callable $callback, array $args = []): intПовторяющийся таймер
Timer::delay(float $seconds, callable $callback, array $args = []): intОдноразовый callback
Timer::add(float $seconds, callable $callback, ?array $args = [], bool $persistent = true): intСовместимый helper для repeat/one-shot
Timer::del(int $timerId): boolОтменить timer
Timer::delAll(): voidУдалить таймеры текущего процесса
Timer::getAll(): arrayДиагностический count текущего event loop
Timer::sleep(float $seconds): voidFiber suspension для suspension-capable backend-а, иначе блокирующий usleep()

Отрицательный интервал вызывает RuntimeException. Callback-и выполняются event loop-ом и не имеют гарантии точного realtime срока.

Пример

use localzet\Timer;

$heartbeat = Timer::repeat(10.0, static function (): void {
    // Check application state without blocking the worker.
});

Timer::delay(2.0, static function (): void {
    // One-time work.
});

Timer::del($heartbeat);

Освобождайте timer ID, когда завершается задача-владелец. Не применяйте Timer::sleep() как универсальную неблокирующую задержку: на Select, event и ev backend-е она блокирует текущий процесс на указанное время. Для других backend-ов проверяйте реализацию SuspensionCapableInterface.