Generates Object Pool pattern for PHP 8.4. Creates reusable object containers for expensive resources like connections. Includes unit tests.
From accnpx claudepluginhub dykyi-roman/awesome-claude-code --plugin accThis skill uses the workspace's default tool permissions.
references/examples.mdreferences/templates.mdCreates Object Pool pattern infrastructure for managing reusable expensive objects.
| Scenario | Example |
|---|---|
| Expensive creation | Database connections |
| Limited resources | HTTP client handles |
| Connection reuse | Socket connections |
| Memory management | Large object caching |
Path: src/Infrastructure/Pool/
PoolInterface.php — Generic pool contract with acquire/releasePoolConfig.php — Configuration value object (min/max size, timeouts)PoolableInterface.php — Contract for poolable objects (reset, isValid, close)ObjectPool.php — Generic pool implementationPooledObject.php — Wrapper tracking usage metricsPoolExhaustedException.php — Exception for exhausted poolInvalidPoolObjectException.php — Exception for invalid objectsPath: src/Infrastructure/{Domain}/
{Type}Pool.php — Specialized pool (ConnectionPool, HttpClientPool)Poolable{Type}.php — Poolable implementation for specific resourcePath: tests/Unit/Infrastructure/Pool/
ObjectPoolTest.php — Core pool functionality tests{Type}PoolTest.php — Specialized pool tests| Component | Path |
|---|---|
| Pool Interface | src/Infrastructure/Pool/ |
| Pool Implementation | src/Infrastructure/Pool/ |
| Specialized Pools | src/Infrastructure/{Domain}/ |
| Unit Tests | tests/Unit/Infrastructure/Pool/ |
| Component | Pattern | Example |
|---|---|---|
| Interface | PoolInterface | PoolInterface |
| Implementation | ObjectPool | ObjectPool |
| Poolable Interface | PoolableInterface | PoolableInterface |
| Config | PoolConfig | PoolConfig |
| Wrapper | PooledObject | PooledObject |
| Specialized Pool | {Type}Pool | ConnectionPool |
| Test | {ClassName}Test | ObjectPoolTest |
/**
* @template T
*/
interface PoolInterface
{
/** @return T */
public function acquire(): mixed;
/** @param T $object */
public function release(mixed $object): void;
public function getAvailableCount(): int;
public function getActiveCount(): int;
public function getMaxSize(): int;
public function clear(): void;
}
interface PoolableInterface
{
public function reset(): void;
public function isValid(): bool;
public function close(): void;
}
final readonly class PoolConfig
{
public function __construct(
public int $minSize = 0,
public int $maxSize = 10,
public int $maxWaitTimeMs = 5000,
public int $idleTimeoutSeconds = 300,
public bool $validateOnAcquire = true,
public bool $validateOnRelease = false
);
public static function default(): self;
public static function forDatabase(): self;
public static function forHttpClients(): self;
}
// Create pool
$pool = new ObjectPool(
name: 'database',
factory: fn() => $connectionFactory->create(),
config: PoolConfig::forDatabase(),
logger: $logger
);
// Acquire and release
$connection = $pool->acquire();
try {
$result = $connection->query('SELECT ...');
} finally {
$pool->release($connection);
}
// Or use helper
$result = $connectionPool->execute(fn($conn) => $conn->query('SELECT ...'));
| Anti-pattern | Problem | Solution |
|---|---|---|
| No Validation | Returning broken objects | Validate on acquire |
| No Reset | State leaks between uses | Call reset() on release |
| No Timeout | Infinite wait | Set maxWaitTime |
| Unbounded Pool | Memory exhaustion | Set maxSize |
| Not Releasing | Pool exhaustion | Use try/finally |
| Wrong Scope | Per-request pools | Use singleton/shared pool |
For complete PHP templates and examples, see:
references/templates.md — All component templatesreferences/examples.md — ConnectionPool, HttpClientPool examples and testsProvides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.