Symfony 4.4: Pré-carregamento de Aplicações Symfony no PHP 7.4
O PHP 7.4, lançado há alguns dias, é o lançamento mais empolgante do PHP em anos. Inclui recursos inovadores, como propriedades tipadas (typed properties), funções de seta (arrow functions), tipos covariantes (covariant types), IFF (Foreign Function Interface), pré-carregamento do OPCache (OPCache preloading), e muito mais.
Pré-carregamento do OPCache
Bem no início, o PHP compilava e fazia parse de qualquer arquivo usado para atender a uma requisição. O resultado da compilação/parse (chamado “opcodes”) não era reutilizado para outras requisições; portanto, o mesmo processo precisava ser repetido várias vezes.
Nos servidores de produção, o código de seus arquivos PHP não muda entre as requisições; portanto, os resultados da compilação e parse podem ser reutilizados. É isso que o OPCache faz (OPCache = “cache de opcodes”), melhorando o desempenho geral entre 2 e 15 vezes.
No entanto, o OPCache não remove outros custos de execução: o PHP ainda precisa verificar se o arquivo fonte foi modificado, copiar certas partes de classes e funções do cache de memória compartilhada para a memória do processo, etc. Além disso, como cada arquivo PHP é compilado/armazenado em cache de forma totalmente independente de qualquer outro arquivo, o PHP não pode resolver dependências entre classes armazenadas em arquivos diferentes e precisa vincular novamente as dependências da classe em tempo de execução para cada requisição.
O PHP 7.4 pode eliminar a maioria desses custos graças ao pré-carregamento. Na inicialização do servidor — antes que qualquer código da aplicação seja executado — o PHP pode carregar um determinado conjunto de arquivos PHP na memória e disponibilizar permanentemente seu conteúdo para todas as requisições subsequentes.
Todas as funções e classes definidas nesses arquivos estarão disponíveis para requisições, exatamente como as entidades internas (por exemplo, strlen()
ou Exception
). De fato, o PHP pode pré-carregar frameworks como o Symfony, inteiros ou parciais, e até toda a biblioteca de classes da aplicação.
Pré-carregamento do OPCache na Prática
O pré-carregamento é controlado por uma nova diretiva no php.ini chamada opcache.preload
. O valor desta diretiva é o caminho do arquivo PHP que pré-carrega os arquivos usando include_once
ou opcache_compile_file()
.
Durante o pré-carregamento, o PHP também resolve dependências de classe e links com parent, interfaces e traits. Ele também remove includes desnecessários e realiza algumas outras otimizações. O resultado geral é uma melhoria de desempenho de 30% a 50% em aplicações reais.
Lembre-se de que os arquivos pré-carregados permanecem para sempre em cache na memória do OPCache. Se você alterar o código-fonte de qualquer arquivo pré-carregado, será necessário reiniciar o servidor web ou as alterações não terão efeito.
Pré-carregamento do OPCache no Symfony
Graças ao comportamento interno do Symfony de compilar arquivos antes de executar a aplicação (por exemplo, o container de serviço), o suporte ao pré-carregamento pode ser feito com apenas algumas alterações. É por isso que o Symfony 4.4 pode gerar um arquivo de pré-carregamento para sua aplicação no diretório de cache. O nome do arquivo gerado inclui os nomes do ambiente e do kernel (por exemplo, var/cache/dev/srcApp_KernelDevDebugContainer.preload.php
).
Você pode usar esse arquivo gerado como o valor da diretiva opcache.preload
do PHP:
; php.ini
opcache.preload=/path/to/project/var/cache/prod/srcApp_KernelProdContainer.preload.php
O próximo passo será permitir que aplicações e bundles configurem também quais das suas classes devem ser pré-carregadas. Confira o Pull Request #33689 para acompanhar o trabalho em andamento referente a esse recurso.
Tradução de: New in Symfony 4.4: Preloading Symfony Applications in PHP 7.4