Skip to content

Feature Scaled clock

github-actions[bot] edited this page Jul 14, 2026 · 1 revision

⏱️ Масштаб времени — ScaledClock

← Возможности · Главная · Сравнение

Декоратор, в котором время течёт в 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[Ускоренный момент]
Loading

Жизненный цикл симуляции

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 минута
Loading

Сравнение с аналогами

Возможность Clock symfony/clock lcobucci/clock beste/clock nesbot/carbon ergebnis/clock 🏆 Победитель
Масштабируемое время Clock
Ускорение и замедление Clock
Валидация коэффициента Clock

Clone this wiki locally