A tradução deste artigo foi preparada especialmente para os alunos do curso Backend PHP Developer .
O PHP 7.4 adiciona o pré-carregamento, um recurso que pode melhorar significativamente o desempenho do código.
Em pré-carga em poucas palavras.
- Para pré-carregar os arquivos, você precisa escrever um script PHP separado.
- Este script é executado uma vez na inicialização do servidor.
- Todos os arquivos pré-carregados estão disponíveis na memória para todas as solicitações.
- As alterações feitas no arquivo de origem não funcionarão até você reiniciar o servidor.
Vamos falar sobre o novo recurso em mais detalhes.
Mais que Opcache
Sim, o pré-carregamento é baseado no opcache, mas não é exatamente a mesma coisa. O Opcache pega os arquivos de origem PHP, os compila em opcodes e salva os arquivos compilados em disco.
Os códigos de opção podem ser considerados uma representação de baixo nível do seu código que é facilmente interpretada em tempo de execução. Assim, o opcache permite que você pule o estágio de tradução dos arquivos de origem para o que o interpretador PHP realmente precisa em tempo de execução. Economia notável!
No entanto, você pode economizar ainda mais. Compilado com arquivos
opcash
, não sabemos nada sobre outros arquivos. Se você tiver a classe A, que é uma extensão da classe B, eles ainda precisarão ser vinculados no tempo de execução. Além disso, o opcache verifica se os arquivos de origem foram alterados e, ao detectar as alterações, invalidará seus caches.
E aqui o pré-carregamento vem em socorro: ele não apenas compila os arquivos de origem em códigos de operação, mas também vincula classes, características e interfaces dependentes. Ele armazena um fragmento "compilado" de código executável (ou seja, código que o interpretador PHP pode usar) na memória.
Quando uma solicitação chega ao servidor, ela pode usar partes da base de código que já foi carregada na memória, sem tempo extra.
De que "partes da base de código" estamos falando?
Prática de pré-carregamento
Para o pré-carregamento correto, o desenvolvedor deve informar ao servidor quais arquivos baixar. Isso é feito usando um script PHP simples, então não há nada a temer.
Nada complicado.
- Você fornece um script de pré-carregamento e vincula-o ao seu arquivo php.ini usando
opcache.preload
. - Cada arquivo PHP que você deseja pré-carregar deve ser passado para
opcache_compile_file()
partir do script de pré-carregamento.
Digamos que você queira pré-carregar algum tipo de estrutura. Que seja Laravel. Nesse caso, seu script deve examinar todos os arquivos PHP no
vendor/laravel
e adicioná-los um de cada vez.
Aqui está como você pode incluir esse script no php.ini:
opcache.preload=/path/to/project/preload.php
E aqui está um exemplo de implementação:
$files = ; foreach ($files as $file) { opcache_compile_file($file); }
Em vez de
opcache_compile_file
você pode usar o
include
. No entanto, parece que houve um
erro aqui , uma vez que no momento da escrita a segunda opção não funcionava.
Aviso de que você não pode pré-carregar uma classe não relacionada
Há um aviso
Não é possível pré-carregar a classe desvinculada ? O fato é que, antes de pré-carregar arquivos, você também precisa pré-carregar seus objetos dependentes - interfaces, características e classes-pai.
Se você encontrar algum problema com dependências de classe, será avisado sobre isso ao iniciar o servidor:
Can't preload unlinked class Illuminate\Database\Query\JoinClause: Unknown parent Illuminate\Database\Query\Builder
Observe que
opcache_compile_file()
apenas
opcache_compile_file()
o arquivo, mas não o executará. Isso significa que se uma classe tiver dependências que não foram pré-carregadas, a própria classe não poderá ser pré-carregada.
Isso não é crítico: o servidor funcionará normalmente, mas você não terá todos os arquivos que deseja pré-carregar à sua disposição.
É por isso que você precisa selecionar cuidadosamente os arquivos para pré-carregamento, a fim de evitar problemas de dependência. Fazer isso manualmente é uma tarefa ingrata e demorada; portanto, os desenvolvedores já estão trabalhando em soluções automatizadas.
Suporte ao compositor
A solução automatizada mais promissora está sendo preparada pelos desenvolvedores do compositor, que já é usada na maioria dos projetos PHP modernos.
Agora, os caras estão trabalhando na capacidade de configurar o pré-carregamento no
composer.json
, que por sua vez irá gerar um arquivo de pré-carregamento em vez de você. Como o pré-carregamento, esse recurso ainda está em desenvolvimento. Você pode acompanhar o desenvolvimento de eventos
aqui .
Felizmente, você não precisa configurar manualmente os arquivos de pré-carregamento, se não quiser - o compositor pode fazer isso por você.
Requisitos do servidor
Existem outros dois pontos importantes que um desenvolvedor deve ter em mente ao usar o pré-carregamento.
Você já sabe que precisa criar uma entrada no
php.ini
para que a pré-carga funcione. Isso significa que, se você usar hospedagem compartilhada, não poderá configurar o PHP como desejar.
Na prática, você precisará de um servidor dedicado (virtual) para otimizar arquivos pré-carregados para um único projeto. Tenha isso em mente.
Lembre-se também de que você precisará reiniciar o servidor (se você usar
php-fpm
, isso é suficiente) toda vez que quiser recarregar arquivos na memória. Para a maioria, isso é óbvio, mas não será supérfluo lembrar.
Desempenho
Agora, a pergunta mais importante: o pré-carregamento realmente melhora o desempenho?
Claro! Ben Morel compartilhou os resultados dos testes comparativos, que podem ser encontrados no mesmo
tópico sobre compositor , que mencionamos acima.
E também, isso é interessante. Se desejar, você pode pré-carregar apenas as chamadas
hot classes
- classes que são frequentemente usadas em sua base de código. Os testes de Ben Morel mostram que o carregamento de apenas 100 dessas classes fornece um aumento de desempenho mais alto do que o pré-carregamento de tudo de uma só vez. No primeiro caso, a produtividade aumenta 17%, no segundo - 13%.
Obviamente, a escolha de classes para pré-carregamento depende do projeto específico. É aconselhável começar simplesmente pré-carregando o máximo possível. Se essas poucas diferenças percentuais no desempenho forem tão importantes para você, você precisará controlar o código em tempo de execução.
Todas essas operações, é claro, podem ser automatizadas, e é provável que isso seja feito no futuro.
Agora é importante que o suporte de pré-carregamento seja adicionado ao
composer
, o que elimina a necessidade de criar arquivos para você. Esse recurso é muito fácil de configurar no servidor, desde que esteja à sua disposição completa.
Você usará o pré-carregamento na nova versão do PHP 7.4? Quaisquer pensamentos ou comentários? Envie-me um email no
Twitter ou
Email .
Tradicionalmente, aguardamos seus comentários e vantagens, se você achar o artigo interessante :-)