Skip to main content

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:

  1. Desabilitar todos os plugins;
  2. Alterar o arquivo php-ini-overrides.ini do 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í:

  1. Reiniciar container do php-fpm;
  2. Conferir se "xdebug parou de funcionar" (use um phpinfo());
  3. Ligar todos os módulos do Accelero;
  4. Entrar no sistema e sair clicando em todo lugar/tela sem dó;
  5. 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:

  1. Alterar o arquivo php-ini-overrides.ini do seu container php-fpm:

    xdebug.mode=off
    opcache.preload=/var/www/accelero/public/preload.php
    opcache.preload_user=www-data
  2. Reiniciar container;

  3. 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)