-
Notifications
You must be signed in to change notification settings - Fork 0
Feature Scaled clock
github-actions[bot] edited this page Jul 14, 2026
·
1 revision
Декоратор, в котором время течёт в N раз быстрее или медленнее реального. Аналогов у сравниваемых пакетов нет.
При создании фиксируется точка отсчёта по внутренним часам. Дальше прошедшее время умножается на коэффициент:
use CloudCastle\Clock\ScaledClock;
use CloudCastle\Clock\SystemClock;
// Сутки за 24 реальные минуты: секунда реального времени = минута виртуального.
$fast = new ScaledClock(SystemClock::utc(), 60.0);
// Замедленное вдвое время.
$slow = new ScaledClock(SystemClock::utc(), 0.5);Коэффициент строго положителен; ноль и отрицательные значения отклоняются
InvalidClockValueException.
Детерминированные симуляции получаются в связке с MockClock:
$mock = MockClock::from('2026-01-01 00:00:00', 'UTC');
$scaled = new ScaledClock($mock, 60.0);
$mock->advance(1.0); // одна «реальная» секунда
$scaled->now()->format('i:s'); // 01:00 — прошла виртуальная минута- Симуляция суток/недель за минуты в нагрузочных и сценарных тестах.
- Точка отсчёта по внутренним часам: с MockClock результат полностью детерминирован.
- Не синхронизирован с реальными расписаниями (cron и т.п.) — это инструмент симуляций.
- Прогон «суточного цикла» биллинга или планировщика в интеграционном тесте.
- Демонстрационные стенды с ускоренной сменой состояний.
- Использовать в проде для «догоняющих» обработок — ускорится только чтение часов, не мир вокруг.
flowchart LR
IN[Внутренние часы] --> SC["ScaledClock(scale)"]
SC -->|"anchor + (inner − anchor) × scale"| OUT[Ускоренный момент]
sequenceDiagram
participant T as Тест
participant S as ScaledClock ×60
participant M as MockClock
T->>S: new ScaledClock(M, 60.0)
S->>M: microtime() — якорь
T->>M: advance(1.0) — «реальная» секунда
T->>S: now()
S->>M: microtime()
S-->>T: якорь + 1с × 60 = +1 минута
| Возможность | Clock | symfony/clock | lcobucci/clock | beste/clock | nesbot/carbon | ergebnis/clock | 🏆 Победитель |
|---|---|---|---|---|---|---|---|
| Масштабируемое время | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | Clock |
| Ускорение и замедление | ✅ | — | — | — | — | — | Clock |
| Валидация коэффициента | ✅ | — | — | — | — | — | Clock |
CloudCastle Clock · · PHP 8.1+
GitHub · Packagist · Releases · Discussions · Issues
Email · Telegram · VK · Сетка · 💜 Поддержать проект
Исходники Wiki — каталог wiki/ в репозитории (синхронизация через GitHub Actions)