Skip to content

Feature Object pool

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

♻️ Object pool

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

Пул переиспользуемых экземпляров: вместо создания нового объекта на каждый make() — берём свободный из пула и возвращаем обратно. Снижает аллокации/GC для дорогих объектов в горячих циклах. Уникальная для CloudCastle возможность среди сравниваемых контейнеров.

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

enablePooling($id, $maxSize) включает пул для сервиса. make($id) при активном пуле берёт свободный экземпляр (или создаёт, пока не достигнут maxSize); releaseToPool($id, $instance) возвращает объект в пул для повторного использования. poolStats(), clearPool(), clearAllPools() — управление. Fast-path make() гейтится дешёвым флагом pooled, поэтому пул не замедляет обычные сервисы.

$c->set(Buffer::class, fn () => new Buffer(8192));
$c->enablePooling(Buffer::class, maxSize: 16);

$buf = $c->make(Buffer::class);   // из пула (или создан)
// … работа …
$c->releaseToPool(Buffer::class, $buf); // вернули для переиспользования

$c->poolStats(Buffer::class);     // ['configured' => true, 'max_size' => 16, 'available' => …]

Плюсы

  • Меньше аллокаций/GC для дорогих объектов в тесных циклах (буферы, парсеры, коннекторы).
  • Ограничение maxSize защищает от неконтролируемого роста.
  • Выключен по умолчанию — платите только там, где явно включили.

Минусы

  • Экземпляр из пула переиспользуется — обязательно сбрасывать его состояние перед/после использования.
  • Забыли releaseToPool() — объект «утёк» из пула (эффект как без пула).
  • Не нужен для дешёвых объектов — усложняет код без выигрыша.

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

  • Пулить только дорогие в создании, часто пересоздаваемые объекты с ясным жизненным циклом.
  • Сбрасывать состояние объекта при возврате в пул (reset()), возвращать через try/finally.

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

  • Пулить объекты с «прилипшим» состоянием без сброса — источник трудноуловимых багов.
  • Включать пул «на всякий случай» для обычных stateless-сервисов (там нужен singleton get()).

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

Контейнер Аналог
PHP-DI нет (❌)
Symfony нет встроенного пула в DI (⚠️)
Laravel нет (❌)
Pimple нет (❌)
Nette нет (❌)

Только CloudCastle среди сравниваемых контейнеров.

См. также: Прототипы (make) · Профилирование.

Clone this wiki locally