Skip to content

Feature Smart cache

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

⏱️ Smart cache (TTL)

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

Ограничение времени жизни singleton: cacheFor($id, $ttl) заставляет контейнер пересоздать сервис по истечении TTL. Плюс явная инвалидация. Уникальная для CloudCastle возможность среди сравниваемых контейнеров.

Принцип работы

ContainerSmartCacheSupport хранит TTL per-id и per-tag (cacheFor, cacheTagFor). При get($id) контейнер проверяет, не истёк ли срок закэшированного экземпляра; если истёк — создаёт заново. forget($id), forgetTag($tag), forgetAll() — явная инвалидация; cacheStats($id) — состояние (настроен ли TTL, когда истекает). Первое задание TTL отключает fast-path get() (нужна проверка срока).

$c->set(ExchangeRates::class, fn () => Api::fetchRates());
$c->cacheFor(ExchangeRates::class, ttlSeconds: 300);   // курсы «живут» 5 минут

$c->get(ExchangeRates::class);   // создан
// … <5 мин — тот же экземпляр …
// … >5 мин — пересоздан свежими данными

$c->forget(ExchangeRates::class); // явно сбросить сейчас
$c->cacheStats(ExchangeRates::class); // ['configured' => true, 'ttl_seconds' => 300, 'expired' => …]

Плюсы

  • Свежесть данных для сервисов, кэширующих внешнее состояние (курсы, конфиг, справочники) без ручного менеджмента.
  • Инвалидация по id и по тегу — точечная и групповая.
  • Выключено по умолчанию — обычные singleton работают на fast-path.

Минусы

  • Первое задание TTL отключает fast-path get() для всего контейнера (проверка срока) — небольшой overhead.
  • TTL — не замена внешнего кэша (Redis) для разделяемых между процессами данных.

✅ Рекомендуется

  • Применять к сервисам, инкапсулирующим «протухающие» данные (курсы, feature-flags, справочники).
  • Комбинировать с тегами: cacheTagFor('external', 60) + forgetTag('external') при событии обновления.

❌ Антипаттерны

  • Городить TTL на stateless-сервисы (клиенты, репозитории) — им пересоздание не нужно.
  • Ожидать, что TTL синхронизирует кэш между процессами/воркерами (это in-process).

Аналоги в других контейнерах

Контейнер Аналог
PHP-DI нет (❌ — кэш определений, но не TTL экземпляров)
Symfony нет в DI (⚠️ — отдельный cache-компонент)
Laravel нет в контейнере (❌ — отдельный Cache)
Pimple нет (❌)
Nette нет (❌)

Только CloudCastle даёт TTL singleton-экземпляров внутри контейнера.

См. также: Фабрики и singleton · Теги.

Clone this wiki locally