O PivotPHP implementa Object Pooling para otimizar performance e uso de memória, especialmente em aplicações de alta demanda.
Object Pooling é uma técnica de otimização que reutiliza objetos já criados ao invés de criar novos a cada requisição. Isso reduz:
- ✅ Garbage Collection desnecessário
- ✅ Alocação de memória excessiva
- ✅ Tempo de criação de objetos
- ✅ Pressão sobre o sistema
use PivotPHP\Core\Http\Factory\OptimizedHttpFactory;
// Configurar pooling
OptimizedHttpFactory::initialize([
'enable_pooling' => true,
'warm_up_pools' => true,
'max_pool_size' => 100,
'enable_metrics' => true,
]);
// Criar objetos com pooling
$request = OptimizedHttpFactory::createRequest('GET', '/api/users', '/api/users');
$response = OptimizedHttpFactory::createResponse();
// Criar objetos PSR-7 com pooling
$psr7Request = OptimizedHttpFactory::createServerRequest('POST', '/api/data');
$psr7Response = OptimizedHttpFactory::createPsr7Response(200, [], '{"status": "ok"}');O sistema mantém pools separados para diferentes tipos de objetos:
// Pool de ServerRequest (PSR-7)
$serverRequest = Psr7Pool::getServerRequest($method, $uri, $body, $headers);
// Pool de Response (PSR-7)
$response = Psr7Pool::getResponse($statusCode, $headers, $body);
// Pool de Uri (PSR-7)
$uri = Psr7Pool::getUri('/api/endpoint');
// Pool de Stream (PSR-7)
$stream = Psr7Pool::getStream('{"data": "content"}');Os objetos são automaticamente retornados ao pool quando não são mais necessários:
class Request {
public function __destruct() {
// Retorna automaticamente ao pool
if ($this->psr7Request !== null) {
Psr7Pool::returnServerRequest($this->psr7Request);
}
}
}OptimizedHttpFactory::initialize([
'enable_pooling' => true, // Habilitar pooling
'warm_up_pools' => true, // Pré-aquecer pools
'max_pool_size' => 100, // Tamanho máximo do pool
'enable_metrics' => true, // Habilitar métricas
]);OptimizedHttpFactory::initialize([
'enable_pooling' => true,
'pool_config' => [
'initial_size' => 50, // Tamanho inicial
'max_size' => 200, // Tamanho máximo
'expansion_factor' => 1.5, // Fator de expansão
'cleanup_interval' => 300, // Intervalo de limpeza (segundos)
],
'stress_handling' => [
'enable_priority' => true, // Sistema de prioridades
'enable_rate_limiting' => true, // Rate limiting
'emergency_limit' => 500, // Limite de emergência
],
]);// Desenvolvimento
OptimizedHttpFactory::initialize([
'enable_pooling' => true,
'max_pool_size' => 20,
'enable_metrics' => true,
]);
// Produção
OptimizedHttpFactory::initialize([
'enable_pooling' => true,
'max_pool_size' => 200,
'warm_up_pools' => true,
'enable_metrics' => true,
]);
// Alta demanda
OptimizedHttpFactory::initialize([
'enable_pooling' => true,
'max_pool_size' => 500,
'emergency_limit' => 1000,
'warm_up_pools' => true,
]);// Obter estatísticas do pool
$stats = OptimizedHttpFactory::getPoolStats();
/*
Array:
[
'pool_sizes' => [
'requests' => 45,
'responses' => 38,
'uris' => 12,
'streams' => 67,
],
'efficiency' => [
'request_reuse_rate' => 78.5,
'response_reuse_rate' => 82.1,
'uri_reuse_rate' => 65.3,
'stream_reuse_rate' => 91.2,
],
'usage' => [
'requests_created' => 1250,
'requests_reused' => 4890,
'responses_created' => 1180,
'responses_reused' => 4920,
],
]
*/$metrics = OptimizedHttpFactory::getPerformanceMetrics();
/*
Array:
[
'memory_usage' => [
'current' => 12582912, // 12MB
'peak' => 15728640, // 15MB
],
'pool_efficiency' => [
'request_reuse_rate' => 78.5,
'response_reuse_rate' => 82.1,
],
'recommendations' => [
'Pool performance is within acceptable ranges',
'Consider increasing pool size for better efficiency',
],
]
*/// Obter estatísticas do pool
$stats = Psr7Pool::getStats();
echo "Pool sizes: " . json_encode($stats['pool_sizes']);
// Limpar todos os pools
Psr7Pool::clearAll();
// Pré-aquecer pools
Psr7Pool::warmUp();// Cada requisição cria novos objetos
for ($i = 0; $i < 1000; $i++) {
$request = new Request('GET', '/api/users', '/api/users');
$response = new Response();
// ... processar
unset($request, $response); // Garbage collection
}
// Resultado: 1000 objetos criados + 1000 GC calls// Objetos são reutilizados
for ($i = 0; $i < 1000; $i++) {
$request = OptimizedHttpFactory::createRequest('GET', '/api/users', '/api/users');
$response = OptimizedHttpFactory::createResponse();
// ... processar
unset($request, $response); // Retorna ao pool automaticamente
}
// Resultado: ~50 objetos criados + reutilização eficienteCenário: 1000 requisições simultâneas
Sem Pooling:
- Objetos criados: 1000
- Tempo: 0.850s
- Memória pico: 45MB
- GC calls: 1000
Com Pooling:
- Objetos criados: 52
- Tempo: 0.420s ⚡ (50% mais rápido)
- Memória pico: 18MB 💾 (60% menos)
- GC calls: 52 ♻️ (95% menos)
O pooling mantém total compatibilidade com PSR-7:
// Imutabilidade preservada
$response1 = OptimizedHttpFactory::createPsr7Response(200);
$response2 = $response1->withStatus(404); // Nova instância do pool
$response3 = $response2->withHeader('X-Custom', 'value'); // Nova instância do pool
// Cada with* retorna nova instância independente
// Pooling funciona transparentemente// Configurar pools específicos
OptimizedHttpFactory::updateConfig([
'pool_config' => [
'server_request_pool_size' => 100,
'response_pool_size' => 150,
'uri_pool_size' => 50,
'stream_pool_size' => 200,
],
]);
// Verificar se pooling está ativo
if (OptimizedHttpFactory::isPoolingEnabled()) {
echo "Pooling ativo! 🚀";
}// Desabilitar temporariamente
OptimizedHttpFactory::setPoolingEnabled(false);
// Limpar todos os pools
OptimizedHttpFactory::clearPools();
// Reabilitar
OptimizedHttpFactory::setPoolingEnabled(true);// Aquecer pools com dados específicos
OptimizedHttpFactory::warmUpPools();
// Ou manualmente
for ($i = 0; $i < 20; $i++) {
$request = OptimizedHttpFactory::createRequest('GET', '/warmup', '/warmup');
OptimizedHttpFactory::returnToPool($request);
}// Configuração para alta demanda
OptimizedHttpFactory::initialize([
'enable_pooling' => true,
'max_pool_size' => 500,
'warm_up_pools' => true,
'pool_config' => [
'expansion_factor' => 2.0,
'emergency_limit' => 1000,
],
]);
// Endpoints com pooling otimizado
$app->get('/api/users', function($req, $res) {
// Objetos vêm do pool automaticamente
return $res->json($userService->getAllUsers());
});// Configuração para microserviços
OptimizedHttpFactory::initialize([
'enable_pooling' => true,
'max_pool_size' => 100,
'enable_metrics' => true,
'stress_handling' => [
'enable_priority' => true,
'enable_rate_limiting' => true,
],
]);// Configuração para tempo real
OptimizedHttpFactory::initialize([
'enable_pooling' => true,
'max_pool_size' => 300,
'warm_up_pools' => true,
'pool_config' => [
'cleanup_interval' => 60, // Limpeza mais frequente
],
]);// Habilitar logs detalhados
OptimizedHttpFactory::initialize([
'enable_pooling' => true,
'debug_config' => [
'log_pool_operations' => true,
'log_reuse_rate' => true,
'log_memory_usage' => true,
],
]);// Analisar performance do pool
$metrics = OptimizedHttpFactory::getPerformanceMetrics();
foreach ($metrics['recommendations'] as $rec) {
echo "💡 {$rec}\n";
}
// Verificar eficiência
foreach ($metrics['pool_efficiency'] as $type => $rate) {
if ($rate < 50) {
echo "⚠️ Low efficiency for {$type}: {$rate}%\n";
}
}O Object Pooling no PivotPHP oferece:
- ✅ Performance otimizada com reutilização inteligente
- ✅ Menor uso de memória em aplicações de alta demanda
- ✅ Compatibilidade total com PSR-7 e Express.js
- ✅ Monitoramento detalhado com métricas em tempo real
- ✅ Configuração flexível para diferentes cenários
- ✅ Gerenciamento automático sem intervenção manual
Ideal para APIs REST, microserviços e aplicações real-time que precisam de máxima performance e eficiência de recursos.