PHP 8: Ajuste de Desempenho com OpCache e JIT
Sua aplicação PHP 8 parece lenta sob carga. Você otimizou consultas, adicionou cache, mas os tempos de resposta ainda estão altos. O culpado pode ser o overhead de execução do próprio PHP. Dois recursos poderosos—OpCache e JIT—podem acelerar drasticamente seu código, mas apenas se configurados corretamente. Este guia explica como eles funcionam e como ajustá-los para cargas de trabalho do mundo real.
O que é OpCache e por que ele importa
PHP é uma linguagem interpretada: cada requisição normalmente analisa e compila seus arquivos fonte em bytecode antes de executar. O OpCache armazena esse bytecode compilado em memória compartilhada, então requisições subsequentes pulam a análise e a compilação. O resultado? Menor uso de CPU e tempos de resposta mais rápidos.
O OpCache está habilitado por padrão em muitas configurações de produção, mas as configurações padrão são conservadoras. Ajustá-lo pode render melhorias de throughput de 2 a 3 vezes para aplicações limitadas por CPU.
Diretivas principais de configuração do OpCache
- opcache.enable: Defina como 1 para habilitar. (Padrão: 1 em produção, 0 em CLI a menos que sobrescrito.)
- opcache.memory_consumption: Tamanho da memória compartilhada em MB. Comece com 128 MB; aumente se você vir
opcache.memory_usagealto. - opcache.max_accelerated_files: Número máximo de arquivos em cache. Defina como um número primo maior que o total de arquivos PHP (por exemplo, 10007).
- opcache.validate_timestamps: Quando 1, o PHP verifica os timestamps dos arquivos em busca de alterações. Defina como 0 em produção para evitar chamadas stat; você deve limpar o cache manualmente após implantações.
- opcache.revalidate_freq: Com que frequência (em segundos) verificar timestamps se validate_timestamps=1. Defina como 0 para desenvolvimento, 60+ para produção.
- opcache.interned_strings_buffer: Memória para strings internadas (MB). Aumente para 16 ou 32 em aplicações grandes.
- opcache.fast_shutdown: Obsoleto no PHP 7.2+, removido no PHP 8.0. Ignore.
- opcache.preload: Caminho para um script de preload (PHP 7.4+). O preload compila e armazena arquivos em cache na inicialização, eliminando o overhead por requisição para classes críticas.
Configurações recomendadas do OpCache para produção
; php.ini
opcache.enable=1
opcache.memory_consumption=256
opcache.max_accelerated_files=20000
opcache.validate_timestamps=0
opcache.revalidate_freq=0
opcache.interned_strings_buffer=32
opcache.preload=/path/to/preload.php
opcache.preload_user=www-data
Após alterar as configurações, reinicie o PHP-FPM. Monitore com opcache_get_status() para verificar a taxa de acertos e o uso de memória.
Entendendo o JIT no PHP 8
A compilação JIT (Just-In-Time) leva o OpCache um passo adiante: ela compila o bytecode em código de máquina nativo em tempo de execução. Isso pode acelerar significativamente tarefas intensivas de CPU, como cálculos matemáticos, mas faz pouco por requisições web típicas dominadas por I/O (banco de dados, sistema de arquivos, rede).
O JIT faz parte do OpCache, então você deve habilitar o OpCache primeiro. No PHP 8, o JIT é configurado via opcache.jit e opcache.jit_buffer_size.
Diretivas de configuração do JIT
- opcache.jit: Controla o modo JIT. Use
tracing(padrão) oufunction. O valor é um código CRTO de 4 dígitos:CRTOonde C=otimização específica de CPU, R=alocação de registradores, T=gatilho, O=nível de otimização. Para a maioria das aplicações,opcache.jit=tracingé suficiente. - opcache.jit_buffer_size: Memória para código JIT em bytes. Comece com 64M ou 128M. Se definido como 0, o JIT fica desabilitado.
- opcache.jit_hot_loop, opcache.jit_hot_func, opcache.jit_hot_return, opcache.jit_hot_side_exit: Limiares para detecção de código quente. Os padrões geralmente são adequados.
Configurações recomendadas do JIT
opcache.jit=tracing
opcache.jit_buffer_size=128M
Nota: o JIT só funciona com o OpCache habilitado. Em CLI, você pode precisar definir opcache.enable_cli=1 para testar o JIT.
OpCache vs JIT: quando usar cada um
| Recurso | OpCache | JIT |
|---|---|---|
| Benefício principal | Armazena bytecode compilado em cache | Compila bytecode em código nativo |
| Melhor para | Todas as aplicações PHP | Scripts intensivos de CPU e de longa duração |
| Impacto em aplicações limitadas por I/O | Alto (reduz análise/compilação) | Baixo ou nenhum |
| Overhead de memória | Moderado | Buffer adicional |
| Complexidade | Baixa | Média |
Guia de ajuste passo a passo
- Habilite o OpCache com as configurações recomendadas acima.
- Monitore o OpCache usando
opcache_get_status()ou ferramentas como OpCache GUI. Mire uma taxa de acertos acima de 99%. - Ajuste a memória se
opcache.memory_usageestiver próximo do limite. - Considere o preload para frameworks grandes (Laravel, Symfony). Crie um script de preload que inclua classes usadas com frequência.
- Habilite o JIT apenas se sua aplicação for limitada por CPU. Teste com e sem JIT para medir o impacto.
- Faça benchmark usando ferramentas como
ab,wrkousiege. Compare requisições por segundo e latência. - Implante mudanças gradualmente e monitore logs de erro para problemas.
Armadilhas comuns e boas práticas
- Não desabilite validate_timestamps em desenvolvimento: Você vai perder tempo se perguntando por que as alterações no código não têm efeito.
- Limpe o OpCache na implantação: Se validate_timestamps=0, você deve redefinir o OpCache (por exemplo, reiniciando o PHP-FPM ou chamando
opcache_reset()). - JIT não é uma bala de prata: Para aplicações CRUD típicas, o OpCache sozinho fornece a maior parte dos ganhos.
- Fique de olho na memória: o buffer do JIT e a memória do OpCache aumentam o consumo do PHP. Certifique-se de que seu servidor tenha RAM suficiente.
- Use o preload com cuidado: arquivos pré-carregados ficam sempre na memória; evite pré-carregar tudo.
FAQ
O JIT melhora o desempenho de todas as aplicações PHP?
Não. O JIT beneficia tarefas intensivas de CPU, como cálculos complexos ou processamento de dados. Para aplicações web limitadas por I/O (consultas a banco de dados, chamadas de API), os ganhos são mínimos. O OpCache sozinho frequentemente fornece a maior aceleração.
Como sei se o OpCache está funcionando?
Verifique phpinfo() para o status do OpCache, ou chame opcache_get_status() em um script. Procure por opcache_enabled => true e uma contagem alta de hits em relação a misses.
Posso usar JIT com PHP 7?
Não. O JIT foi introduzido no PHP 8.0. O PHP 7 suporta apenas OpCache. Se você está no PHP 7, foque no ajuste do OpCache e considere atualizar para o PHP 8 para JIT e outras melhorias de desempenho.
Pronto para analisar o desempenho do seu servidor? Confira nosso Analisador de Logs do Nginx para obter insights dos seus logs de acesso e identificar gargalos.