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.