Ao desenvolver Workers ou comandos que rodam em loop infinito (como consumidores de Kafka ou RabbitMQ), o desenvolvedor enfrenta dois grandes inimigos: a inconsistência de dados (registros fantasma) e o estouro de memória.
Neste artigo, veremos como limpar o banco de dados e manter a saúde do servidor PHP ao mesmo tempo.
1. O Problema: Registros Inconsistentes e Memória Infinita Link para o cabeçalho
Em sistemas legados, é comum encontrar registros com colunas nulas que impedem a lógica de updateOrCreate. Além disso, se o seu script roda 24/7, cada consulta ao banco pode acumular logs internos, e cada objeto criado consome memória que o PHP, por padrão, demora a liberar.
2. A Solução Técnica: Limpeza de Dados e de Recursos Link para o cabeçalho
Para garantir que seu processo seja eterno e à prova de falhas, dividimos a solução em três camadas:
A. Limpeza de Dados (Sanitização) Link para o cabeçalho
Antes de inserir um novo registro, limpamos registros “fantasmas” que possuam chaves parciais (como IDs sem categoria definida).
private function removeInconsistencias($payload)
{
// Remove registros que não possuem o 'tipo' definido para evitar duplicidade
ProductStock::query()
->where('sku_id', $payload['sku_id'])
->whereNull('tipo_estoque')
->delete();
}
B. Otimização do Loop (Memória e Conexão) Link para o cabeçalho
No método principal do comando (handle), precisamos garantir que o ciclo de coleta de lixo do PHP seja acionado e que as conexões inativas sejam encerradas.
public function handle()
{
while (true) {
$this->processarMensagens();
// Boas práticas para Loops Infinitos:
DB::disconnect('conexao_estoque'); // Libera a conexão com o banco
gc_collect_cycles(); // Força a liberação de memória circular
sleep(60);
}
}
C. Uso Eficiente do Eloquent Link para o cabeçalho
Evite o uso de Facades pesadas dentro de loops. Prefira instanciar o Model diretamente e usar o método query() para garantir que cada iteração seja “fresca”.
private function salvaDados($dados)
{
// Usar query() garante uma nova instância do Builder
ProductStock::query()->updateOrCreate(
['sku_id' => $dados['id'], 'tipo' => $dados['tipo']],
$dados
);
}
3. Checklist de Performance para Workers Link para o cabeçalho
Para que seu loop não trave e a memória permaneça estável, aplique estas 3 mudanças simples:
1.No Ciclo Principal: Mantenha sempre o DB::disconnect() e o gc_collect_cycles().
2.Na Recuperação de Dados: Se precisar re-consultar um objeto, use o método fresh() para limpar o cache interno do Eloquent.
3.Na Persistência: Use Model::query()->updateOrCreate(…). O uso explícito do query() ajuda a manter a clareza e evita comportamentos inesperados de instâncias reaproveitadas.
Conclusão Link para o cabeçalho
Um sistema robusto não é apenas aquele que processa o dado corretamente, mas aquele que sabe “limpar a própria sujeira” — tanto no banco de dados quanto na memória RAM.