Ciclo de Reciclagem de Workers
Workers persistentes acumulam memória fragmentada ao longo do tempo. Em vez de aguardar o sistema operacional matar bruscamente o processo com SIGKILL (cancelando requisições de clientes em andamento), o Leakless implementa a Reciclagem Graciosa de Workers.
Condições de Disparo
Um worker é sinalizado para reciclagem quando qualquer um dos seguintes limites é ultrapassado:
- Teto de Memória RSS Real (
maxRssMb):- O Resident Set Size medido no Linux ao final da requisição ultrapassa o valor configurado (ex:
256.0 MB).
- O Resident Set Size medido no Linux ao final da requisição ultrapassa o valor configurado (ex:
- Limite de Requisições (
maxRequests):- O número total de requisições atendidas pelo worker atinge o limite configurado (ex:
1000 requisições).
- O número total de requisições atendidas pelo worker atinge o limite configurado (ex:
A Sequência de Reciclagem
- Conclusão da Requisição Ativa: A requisição em andamento é processada normalmente, gera a resposta HTTP e a envia com sucesso para o cliente.
- Auditoria de Pós-Requisição: No
$leakless->endRequest(), o Leakless finaliza auditorias de transações PDO, restaura fuso horário/buffers e avalia o RSS. - Sinalização de Reinício Gracioso:
- No Laravel Octane: Notifica o runner do Octane para reciclar o worker. O Octane inicializa um novo worker limpo em background.
- No FrankenPHP Vanilla: O
FrankenPhp::run()encerra o loop de forma graciosa (exit(0)), permitindo que o gerenciador do FrankenPHP suba um novo worker. - Em Loops Manuais: O booleano
Report::$shouldRecycleinforma ao seu loop que é hora de finalizar o processo.
Exemplo de Configuração
php
use TheMattos\Leakless\Config;
$config = new Config(
maxRssMb: 512.0, // Recicla se a memória física ultrapassar 512MB
maxRequests: 5000, // Recicla após 5.000 requisições processadas
);