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): void | Fiber 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.

