Esta comparação entre manipuladores PHP mostra como mod_php, CGI, FastCGI, PHP-FPM e LSAPI Desempenho da sua hospedagem – desde a carga da CPU até as latências de cauda. Explico concretamente qual escolha fazer no WordPress, WooCommerce e picos de tráfego. Tempo de carregamento reduz e, ao mesmo tempo, poupa recursos.
Pontos centrais
- PHP-FPM Escala de forma mais eficiente do que mod_php e FastCGI.
- LSAPI oferece os melhores valores no LiteSpeed.
- Isolamento por utilizador aumenta a segurança.
- OPcache e Redis reduzem as latências.
- P95/P99 mostra a experiência real do utilizador.
Como funcionam os manipuladores PHP
Um manipulador PHP liga o servidor web ao interpretador e controla Processos, memória e E/S para cada solicitação. O CGI inicia um novo processo para cada solicitação e recarrega as configurações, o que gera sobrecarga e aumenta o Latência Aumentado. Variantes modernas como FastCGI, PHP-FPM ou LSAPI mantêm os trabalhadores disponíveis de forma persistente, poupando assim tempo de arranque, mudanças de contexto e ciclos de CPU. O OPcache permanece na memória, o que significa que o bytecode não precisa de ser compilado todas as vezes e as páginas dinâmicas respondem mais rapidamente. Ao mesmo tempo, a gestão de processos decide quantas solicitações simultâneas podem ser executadas, como as prioridades são definidas e como os picos de carga podem ser amortecidos.
Comparação direta dos manipuladores mais comuns
A escolha do manipulador determina a Escalonamento, o modelo de segurança e os requisitos de RAM de uma aplicação. O mod_php integra o PHP no processo Apache e oferece tempos de resposta curtos, mas sofre de fraca Isolamento entre contas. O CGI separa os utilizadores de forma clara, mas consome muito tempo de CPU por pedido. O FastCGI reduz a sobrecarga, mas continua a ser menos eficiente do que um PHP-FPM bem ajustado. O LSAPI vai ainda mais longe quando o LiteSpeed está em uso e estabiliza especialmente as latências de cauda em muitas ligações simultâneas.
| manipulador | Desempenho | Segurança | Requisitos de RAM | Escalabilidade | Cenário operacional |
|---|---|---|---|---|---|
| mod_php | Elevado | Baixa | Baixa | Médio | Pequenos sites, picos raros |
| CGI | Baixa | Elevado | Elevado | Baixa | Conteúdos estáticos, testes |
| FastCGI | Médio | Médio | Médio | Médio | solução provisória |
| PHP-FPM | Muito elevado | Elevado | Baixa | Elevado | Hospedagem partilhada, CMS |
| LSAPI | Mais alto | Médio | Muito baixo | Muito elevado | Alto tráfego, comércio eletrónico |
PHP-FPM na prática: processos, pools, ajuste
O PHP-FPM funciona com pools de trabalhadores que retiram as solicitações de uma fila e, assim, Picos de carga amortecer elegantemente. Eu defino um pool próprio para cada site, para que a configuração, os limites e o contexto do utilizador permaneçam separados e o Segurança aumenta. Na prática, configurações adaptativas como pm = dynamic ou ondemand são vantajosas, pois o número de processos ativos se adapta à demanda. É fundamental dimensionar corretamente pm.max_children e os limites de tempo, para que a fila não cresça e ainda haja reservas de RAM. Para começar, recomendo verificar os parâmetros de forma estruturada; explico os detalhes do ajuste fino aqui: Gestão de processos PHP-FPM.
LSAPI e LiteSpeed: valor máximo com alta simultaneidade
O LSAPI mantém os processos PHP na memória e reduz as mudanças de contexto, permitindo que conteúdos dinâmicos sejam gerados com HTTP/3 e QUIC ainda mais suavemente. Sob carga total, a latência P95/P99 permanece mais estável do que em muitas alternativas, o que Experiência do utilizador visivelmente melhorado. Vejo regularmente mais consultas por segundo e TTFB mais curto nas páginas da loja e de conteúdo, especialmente quando o OPcache e o cache do servidor funcionam em conjunto. A vantagem não se reflete apenas nos valores médios, mas também em sessões simultâneas, sessões com falhas de cache e trabalhadores PHP „frios“. Quem quiser entender a diferença de arquitetura, leia a visão geral sobre LiteSpeed vs. Nginx e, em seguida, decide sobre a pilha.
WordPress e WooCommerce: classificar corretamente os valores medidos
No WordPress, consigo um desempenho elevado com PHP 8.2 no FPM ou LSAPI. req/s, enquanto o WooCommerce gera um pouco menos de solicitações por segundo devido a sessões, lógica do carrinho e mais acessos ao banco de dados. O teste só se torna significativo em condições realistas. Tráfego com acertos e falhas de cache misturados. CSS crítico, cache de objetos e conexões persistentes mudam o limite a partir do qual surgem gargalos. TTLs curtos para conteúdos alterados com frequência e chaves de cache diferenciadas para idioma, status do utilizador e tipo de dispositivo são particularmente úteis. Assim, a página permanece rápida, embora forneça conteúdos personalizados.
Segurança e isolamento: pools, contexto do utilizador, limites
Prefiro hospedagem multiusuário separada piscinas por conta, para que os direitos, caminhos e limites permaneçam claramente separados. O mod_php partilha um contexto comum, o que Risco aumenta quando um projeto apresenta lacunas. O FPM ou o LSAPI com configurações por utilizador reduzem significativamente essa vulnerabilidade, pois os processos são executados sob o respetivo utilizador. Além disso, é possível definir diferentes opções php.ini no nível do projeto, sem afetar outros sites. Limites de recursos, como max_execution_time e memory_limit por pool, impedem que exceções sobrecarreguem o servidor.
Consumo de recursos e planeamento de RAM
Cada PHP Worker ocupa, dependendo do código, extensões e OPcacheMemória que varia significativamente em tamanho, por isso eu meço a ocupação real em vez de adivinhar. Ferramentas como ps, top ou systemd-cgtop mostram quanto RAM os trabalhadores ativos realmente ocupam e quando Troca ameaça. Em seguida, defino pm.max_children de forma conservadora, deixo espaço para a base de dados, servidor web e serviços de cache e observo a latência P95 abaixo do pico. Se sobrar reserva, aumento gradualmente o número de filhos e verifico novamente. Assim, a capacidade total cresce de forma controlada, sem sobrecarregar o servidor.
Metodologia de medição: do TTFB ao P99
Não avalio apenas valores médios, mas principalmente P95– e latências P99, porque refletem a experiência real sob carga. Uma pilha pode funcionar com um rendimento idêntico e, mesmo assim, ter um desempenho pior em P99 se Filas de espera crescer. Por isso, testo caches frias e quentes, misturo pedidos de leitura e escrita e utilizo valores de concorrência realistas. Sem o aquecimento do OPcache, interpreto os resultados com cautela, pois muitos sistemas ficam significativamente mais rápidos após algumas chamadas de aquecimento. Só após testes representativos é que decido sobre os manipuladores, a estratégia de cache e os limites do processo.
Guia de decisão para a escolha do manipulador
Para páginas pequenas com poucos logins, basta o mod_php ou um FPM-Configuração, desde que os aspetos de segurança sejam abordados. Se a simultaneidade aumentar, mudo para PHP-FPM com pools separadas por projeto e ativo o OPcache de forma consistente. Para lojas altamente dinâmicas e com muitas sessões, prefiro o LiteSpeed com LSAPI para manter o P95 e o P99 baixos. Quem permanecer no Apache/Nginx por motivos de preço ou arquitetura terá um ótimo desempenho com o FPM bem ajustado. Em todos os casos, a medição em condições realistas é mais importante do que benchmarks em um sistema vazio.
Configuração prática: cache, sessões, limites de tempo
Aposte no OPcache com generosas Memória-Alocação, para que o bytecode raramente seja substituído, e transfira as sessões, se possível, para Redis, para evitar bloqueios de ficheiros. Isso reduz os tempos de espera em logins simultâneos e páginas personalizadas. Para serviços externos, defino tempos limite e disjuntores claros, para que as falhas não bloqueiem toda a solicitação. No nível da aplicação, mantenho os TTLs do cache curtos o suficiente para manter a atualidade, mas longos o suficiente para uma alta taxa de acertos. Quem atinge regularmente os limites de trabalho encontra aqui uma introdução: Equilibrar corretamente os PHP Workers.
Comparação custo-benefício e operação
Eu classifico o Custos uma mudança em troca de ganhos mensuráveis em latência, rendimento e confiabilidade. A mudança do FastCGI para o PHP-FPM muitas vezes traz mais benefícios do que uma mudança no número da versão secundária do PHP, porque Processo-Gestão e cache atuam continuamente. O LSAPI vale a pena principalmente quando o LiteSpeed já está em uso e há muitos visitantes simultâneos. Quem mudar a pilha deve acompanhar de perto os registos e métricas e preparar caminhos de reversão. Uma operação A/B planeada ao longo de vários dias fornece as informações mais fiáveis.
Interação entre servidores web: Apache-MPM, Nginx e Keep-Alive
Na prática, não é apenas o manipulador PHP que decide, mas também o modo do servidor web. O mod_php funciona com o Apache no prefork-MPM, mas bloqueia a utilização de modelos de eventos modernos. Quem deseja utilizar HTTP/2, fases Keep-Alive mais longas e milhares de ligações de forma eficiente, deve optar pelo Apache. evento + PHP-FPM ou Nginx/LiteSpeed como front-end. Consequência: o número de PHP Workers necessários não depende do número de ligações TCP, mas sim do número real de ao mesmo tempo solicitações PHP em execução. A multiplexação HTTP/2/3 reduz, portanto, a sobrecarga de cabeçalhos no servidor web, mas não altera nada em pools PHP com dimensões insuficientes.
O Nginx normalmente encaminha as solicitações para o FPM através do FastCGI. Eu presto atenção a tempo_limite_de_leitura- e tempo_limite_de_envioValores no proxy, caso contrário, ocorrerão erros 502/504 em upstreams pendentes, embora o PHP ainda esteja a funcionar. Em ambientes Apache, limito o Keep-Alive para que conexões ociosas longas não ocupem o pool de threads. O LiteSpeed abstrai muito disso, mas só aproveita totalmente a sua vantagem com o LSAPI.
OPcache, JIT e pré-carregamento: o que realmente ajuda
O OPcache é obrigatório. Na prática, eu dimensiono opcache.memory_consumption generoso (por exemplo, 192–512 MB, dependendo da base de código) e aumente opcache.max_accelerated_files, para evitar evictions. Para builds que raramente são implementadas, desativo validar_carimbos_de_data/hora ou defina um valor mais alto revalidar_freq, para poupar chamadas do sistema. Pré-carregamento pode acelerar os frameworks, mas tem um efeito especialmente significativo quando a estrutura de autoload é consistente. O JIT O PHP raramente traz vantagens para cargas de trabalho web clássicas e pode até consumir RAM; só o ativo quando benchmarks em condições reais confirmam isso.
Gestão de filas e contrapressão
A maioria dos gargalos não ocorre na CPU, mas na fila de espera. Quando chegam mais pedidos do que os trabalhadores conseguem processar, a fila aumenta e a latência P95/P99 dispara. Eu garanto que pm.max_children grande o suficiente para absorver picos típicos, mas pequeno o suficiente para manter reserva de RAM. pm.max_requests Eu defino um valor moderado (por exemplo, 500–2000) para que os vazamentos de memória não criem processos de longa duração. O lista.backlog deve corresponder ao backlog do servidor web, caso contrário, o kernel interromperá as ligações sob carga. Quem medir a taxa de chegada (solicitações por segundo) e o tempo médio de serviço pode avaliar, com um simples cálculo de capacidade, a partir de qual concorrência a latência diminui.
Timeouts, uploads e long runners
Uploads longos ou chamadas API bloqueiam os trabalhadores. Eu defino limites claros: tempo_de_execução_máx e request_terminate_timeout no FPM, evito que pedidos defeituosos continuem a ser executados indefinidamente. Ao nível do proxy, sincronizo tempo_limite_de_leitura_proxy/fastcgi_read_timeout com os limites FPM, para evitar um 504 prematuro. Transmito grandes uploads, limito tamanho_máximo_do_post e tamanho_máximo_de_arquivo_para_upload rigorosamente e planeie pontos finais dedicados, para que o restante tráfego não seja afetado. Para tarefas de longa duração semelhantes ao cron, eu transfiro o trabalho para Tacos ou tarefas CLI, em vez de bloquear os trabalhadores front-end durante minutos.
Sessões e bloqueio em detalhe
As sessões PHP são, por predefinição, bloqueando. Um segundo pedido do mesmo utilizador aguarda até que o primeiro libere a sessão – o que é fatal para o WooCommerce, se houver chamadas Ajax em paralelo. Eu encerro os acessos de gravação da sessão antecipadamente com session_write_close(), assim que não forem mais necessárias alterações. Com o Redis como backend de sessão, a latência de E/S diminui, mas as regras de bloqueio continuam sendo importantes. Por trás dos balanceadores de carga, eu decido conscientemente entre sessões fixas (simples, menos escaláveis) e padrões sem estado com cache de objetos, para que a escalabilidade horizontal funcione corretamente.
Monitorização e resolução de problemas
Sem telemetria, o ajuste é uma tarefa cega. Eu ativo o estado FPM e os registos lentos por pool para ver os pontos de estrangulamento e identificar consultas que se destacam.
; por pool pm.status_path = /status ping.path = /ping ping.response = pong request_slowlog_timeout = 3s slowlog = /var/log/php-fpm/www-slow.log pm.max_requests = 1000
Se ocorrerem erros 502/504, primeiro verifico: a fila FPM está cheia? Há roubo de CPU ou troca? O tempo limite do servidor web está de acordo com os limites FPM? Uma olhadela em smaps por trabalhador mostra a ocupação RSS real, enquanto netstat/ss Detecta excessos de backlog. Para o OPcache, observo a taxa de acertos e o número de revalidações para evitar evictions.
Contentores, sockets e limites de recursos
Em contentores, costumo usar TCP em vez de sockets Unix entre o servidor web e o FPM, para evitar limites de namespace e facilitar o balanceamento de carga. É importante que haja consistência cgroupLimites: se o contentor tiver apenas 1–2 GB de RAM, pm.max_children deve ser correspondentemente menor, caso contrário, o OOM-Killer será acionado. As quotas de CPU influenciam significativamente o tempo de resposta; eu planeio uma margem e verifico a latência P95 abaixo do limite. As questões de NUMA e afinidade de núcleo tornam-se relevantes em cargas muito elevadas, enquanto o LSAPI otimiza muito disso internamente em configurações LiteSpeed.
Várias versões PHP e extensões
Muitos hosts executam várias versões do PHP em paralelo. Eu isolo os pools por versão e mantenho Extensões Enxuto. Cada módulo adicional aumenta a RAM por trabalhador e pode prolongar o tempo de inicialização. Eu removo consistentemente as extensões não utilizadas; isso geralmente traz mais benefícios do que um pequeno aumento no pm.max_children. Durante a atualização, eu planeio fases curtas de aquecimento para o OPcache, para que, após a implementação, nem todos os utilizadores experimentem inicializações a frio ao mesmo tempo.
Dieta de RAM e planeamento realista da capacidade
Em vez de valores fixos, determino a necessidade média e máxima de RAM por trabalhador com tráfego ao vivo. A partir disso, deduzo: (RAM disponível – sistema/banco de dados/caches) / RAM por trabalhador = máxima pm.max_children adequado. Além disso, mantenho uma reserva de 15–25 % para picos, cache do kernel e picos imprevistos. Se a aplicação aumentar esporadicamente a memória, reduzo o limite ou diminuo o pm.max_requests para reciclar os processos com mais frequência.
Estratégia de teste: carga reprodutível e padrões reais
Eu uso perfis de teste que misturam caches frios e quentes, combinam GET/POST e aumentam gradualmente a concorrência. Importante: só com o OPcache ativo e tempos de reflexão realistas é que consigo ver se o sistema permanece estável sob o comportamento de utilização. Um aumento gradual ao longo de vários minutos evita picos artificiais no arranque. A avaliação centra-se no TTFB e no P95/P99, e não apenas no RTT médio ou no req/s puro.
Erros comuns na prática
- Muitos 504 abaixo do pico: fila FPM cheia, backlog muito pequeno, tempos limite no proxy mais curtos do que no FPM.
- Gagueira nas implementações: substituições OPcache, falta de aquecimento, opcache.memory_consumption muito pequeno.
- Bons valores médios, mau P99: demasiados processos de longa duração (I/O, APIs externas), falta de interrupção de circuito.
- CPU elevada, req/s baixo: bloqueios de sessão ou consultas à base de dados não armazenadas em cache, que limitam a série.
Segurança operacional e reversão
Qualquer alteração no manipulador ou nos parâmetros do pool é executada com Bandeiras de caraterísticas ou gradualmente. Eu mantenho os erros e os registos de lentidão, P95 e taxa de erros sob vigilância e defino uma reversão clara, caso as métricas se alterem. Um segundo pool com versão idêntica, mas parâmetros diferentes, permite uma mudança rápida de A/B sem tempo de inatividade. Sob carga total, uma redução curta e automática da concorrência (contrapressão) é mais eficaz do que iniciar novos trabalhadores de forma descontrolada.
Brevemente resumido
Para sites dinâmicos com muitos utilizadores simultâneos, prefiro LSAPI no LiteSpeed, enquanto o PHP-FPM no Apache ou Nginx oferece o melhor Todo-o-terreno O mod_php continua a ser um caso especial para projetos muito simples, sem isolamento rigoroso. O importante é realizar testes realistas com OPcache aquecido, limites de pool razoáveis e cache limpo. Quem reduz a latência de forma fiável mede P95/P99 e reage primeiro a problemas de cauda, em vez de valores médios. Assim, uma aplicação obtém respostas visivelmente mais rápidas e mais reservas para picos de tráfego.


