🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano
MonotonicClock — монотонные часы
Назначение
Показания не убывают даже при переводе системных часов назад (NTP-коррекция, ручной перевод): дельта берётся из hrtime().
Для чего и как применять
Измерение интервалов, rate-limiting, тайм-ауты в долгоживущих процессах (демоны, воркеры очередей).
Пример
$clock = new MonotonicClock('UTC');
$start = $clock->microtime();
// ... системные часы перевели назад ...
$elapsed = $clock->microtime() - $start; // всё равно >= 0
Анти-паттерны
Не для «настенного» времени: показания расходятся с реальными часами после их перевода.
Жизненный цикл
stateDiagram-v2
[*] --> Anchored: new MonotonicClock()
Anchored --> Reading: now() = anchor + hrtime delta
Reading --> Reading: monotonic growth
note right of Reading: system clock jumps\ndo not affect readings
Сравнение возможности с аналогами
| Аспект | 🏆 CloudCastle | symfony | carbon | lcobucci | beste | ergebnis |
|---|---|---|---|---|---|---|
| Устойчивость к откату системных часов | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
Наносекундная основа (hrtime) | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Полный контракт часов (timestamp/microtime) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Произвольная таймзона выдачи | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
Реальный sleep()/sleepUntil() с досыпанием после сигнала | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Всего | 🏆 5 | 4 | 0 | 0 | 0 | 0 |
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano