Todo desenvolvedor já fez besteira. Mas poucas besteiras são tão eficientes quanto escrever um “=“ no lugar errado e transformar um servidor robusto em um peso de papel de 10 kg.
Sim, este é um relato técnico.
Sim, é baseado em fatos reais.
Sim, é exatamente o que você está imaginando.
O cenário perfeito para a tragédia
A máquina era um Xeon parrudo, várias versões de PHP-FPM rodando lado a lado, tudo estável.
Até que um script inocente precisava apenas verificar se o status era “Concluído”.
O que poderia dar errado?
if ($status = "Concluído") {
// código
}
Tudo. Absolutamente tudo.
Afinal, isso não é uma comparação. Isso é atribuição.
E o PHP, com toda a bondade do inferno, aceita e segue em frente.
O efeito dominó
Esse pequeno caractere:
- quebrou a lógica,
- gerou comportamento inesperado,
- desencadeou um fluxo que não deveria existir,
- e fez o PHP-FPM entrar num loop de requisições presas.
E quando o FPM trava, adivinha?
As outras versões travam junto.
Porque o sistema operacional não quer perder a festa e resolve engasgar tudo de uma vez.
O Xeon, com dezenas de threads ociosas, simplesmente… parou.
Load à lua. Top 100% CPU.
E a máquina inteira no modo “vamos todos morrer juntos”.
A experiência extra-sensorial
Você aperta CTRL+C, não responde.
Você tenta reiniciar o FPM, não responde.
Você tenta matar os processos, nada.
Você olha para o monitor e percebe que até o cursor do mouse está decepcionado.
No fim, sobra a onipotente solução universal:
reiniciar o servidor inteiro como quem formata a alma.
Por que isso acontece de verdade
Tecnicamente:
- O FPM cria workers que atendem requisições.
- Um loop preso consome um worker.
- Se várias requisições acionam a mesma condição errada, vários workers morrem.
- Quando todos os workers travam, o FPM não responde mais.
- E se a configuração geral compartilha recursos entre pools (algo comum), a queda vira cascata.
- O Linux tenta gerenciar o caos, entra em pressão de CPU, swap, load descontrolado.
- E o servidor parece um Windows 98 abrindo o Photoshop.
Agora imagine isso num host compartilhado
Se no Xeon local um único arquivo parou o planeta, imagine isso num ambiente onde:
- todos usam o mesmo FPM,
- ninguém isola pool por usuário,
- e o limite de processos já é baixo.
Você derruba não só o seu site, mas também:
- o da pizzaria da esquina,
- o da ótica do condomínio,
- o do cara que vende curso milagroso,
- e mais uns 40 blogs WordPress de astrologia.
É quase um ataque DDoS acidental, assinado por “um dev só testando um negocinho”.
Moral técnica da história
Nunca confie em:
if ($status = "Concluído")
Use:
if ($status === "Concluído")
E sempre teste scripts duvidosos em:
- Docker, (eu odeio de paixão Docker)
- VM isolada,
- local,
- qualquer coisa que não seja servidor real.
Porque basta um caractere errado para transformar um Xeon em um peso de porta.
