O QUE É
O PHP possui, a partir da versão 7.4, um recurso chamado PRELOADING.
Em resumo, é uma forma de reduzir consideravelmente o tempo de "carregamento de arquivos" que ocorre toda vez que um request chega no servidor (tratamento de "requires" no código).
Para maiores detalhes, alguns links interessantes:
O Accelero faz uso desse recurso por padrão pra ganhar "alguns milissegundos de velocidade".
RESUMO DO FUNCIONAMENTO
Todo request HTTP que bate no servidor "começa do zero". Isso significa que o PHP (php-fpm) abre o index.php que faz um require bootstrap.php, que por sua faz um require dtabase.php e assim por diante... centenas e centenas de arquivos que precisam ser lidos todas as vezes que bate um request HTTP. Embora isso seja muito rápido, "centenas de coisas muito rápidas" acabam levando um tempo não-insignificante.
Com o preload, você pode instruir o php-fpm pra "compilar" (muitas aspas) alguns arquivos de antemão, de modo que o request "já começa meio que pronto", e o PHP só precisa ir no disco pra buscar as coisas que não foram previamente compiladas.
Pra isso funcionar, você precisa criar configurar algumas coisas no php.ini e criar um "script de preload" (que em geral é basicamente um monte de "require" dos arquivos que você quer pré-compilar).
Fez isso, reiniciou o serviço do php-fpm, tá funcionando.
PEGADINHA
Com preload, os arquivos são compilados pelo php-fpm quando o serviço entra no ar, e nunca mais se olha pro arquivo em disco. Isso significa que não basta alterar um arquivo em disco pra "atualizar o script" (que é o paradigma comum do PHP)... é necessário reiniciar o serviço/container php-fpm.
ESTRATÉGIAS DE PRELOAD
A estratégia mais simples é pegar todos os arquivos PHP do projeto e jogá-los pra dentro do script de preload. Funciona. Não é ideal, porque é tanta coisa que o custo da pré-compilação + uso de memória pode ser maior que o ganho de "não ter que ficar fazendo require".
A melhor estratégia é descobrir "quais são os arquivos mais acessados numa situação real" e incluir apenas esses. Pra isso, temos que fazer uso do OPCache, ferramenta interna de cache do PHP. Mas cuidado: o OPCache não funciona se o XDebug estiver ativado!
TL;DR
Ficou com vontade de atualizar o preload.php? Faça o seguinte no seu ambiente de desenvolvimento:
- Desabilitar todos os plugins;
- Alterar o arquivo
php-ini-overrides.inido seu container php-fpm:
xdebug.mode=off
#opcache.preload=/var/www/accelero/public/preload.php
#opcache.preload_user=www-data
Com isso, você desabilitou o XDebug e desabilitou o preload no seu ambiente. Daí:
- Reiniciar container do php-fpm;
- Conferir se "xdebug parou de funcionar" (use um
phpinfo()); - Ligar todos os módulos do Accelero;
- Entrar no sistema e sair clicando em todo lugar/tela sem dó;
- Executar o
devtools/PreloadBundleGenerator(em tela).
Com isso, você gerou estatísticas suficiente pro OPCache saber "quais arquivos são importantes" e gerou um novo preload.php.
Agora vamos ver se funciona:
-
Alterar o arquivo
php-ini-overrides.inido seu container php-fpm:xdebug.mode=offopcache.preload=/var/www/accelero/public/preload.phpopcache.preload_user=www-data -
Reiniciar container;
-
Conferir se funcionou.
- se sim, procedimento finalizado.
- se não, descobrir o que está dando problema e corrigir/tirar-do-preload.php (veja os logs do container php-fpm que ele te informa o que está errado, qual arquivo deu problema)