Preloading
A partir do PHP 7.4.0, o PHP pode ser configurado para pré-carregar scripts no opcache quando o mecanismo
é iniciado. Quaisquer funções, classes, interfaces ou traits (mas não constantes) nestes arquivos ficarão
globalmente disponíveis para todas as solicitações sem precisar ser incluídas explicitamente. Isso troca conveniência
e desempenho (porque o código está sempre disponível) para uso de memória de linha de base. Também requer
a reinicialização do processo PHP para limpar os scripts pré-carregados, o que significa que esse recurso
é prático apenas para uso em produção, não em um ambiente de desenvolvimento.
Observe que a compensação ideal entre desempenho e memória pode variar de acordo com o aplicativo.
"Pré-carregar tudo" pode ser a estratégia mais fácil, mas não necessariamente a melhor estratégia. Além disso,
o pré-carregamento só é útil quando há um processo persistente de uma solicitação para outra. Isso significa que,
embora possa funcionar em um script CLI se o opcache estiver ativado, geralmente é inútil. A exceção
é ao usar o pré-carregamento em bibliotecas FFI.
Nota:
O pré-carregamento não é suportado no Windows.
A configuração do pré-carregamento envolve duas etapas e requer que o opcache esteja ativado.
Primeiro, defina o valor opcache.preload
em php.ini:
preload.php é um arquivo arbitrário que será executado uma vez na inicialização do servidor
(PHP-FPM, mod_php, etc.) e carregará o código na memória persistente. Em servidores que iniciam como
root antes de alternar para um usuário de sistema sem privilégios, ou se o PHP for executado como root
(não recomendado), o valor opcache.preload_user
pode especificar o usuário do sistema para executar o pré-carregamento. A execução do pré-carregamento como root
não é permitida por padrão. Configure opcache.preload_user=root para permiti-lo explicitamente.
No script preload.php, qualquer arquivo referenciado por include,
include_once, require, require_once ou
opcache_compile_file() será analisado na memória persistente. No exemplo a seguir,
todos os arquivos .php no diretório src serão pré-carregados, a menos que
sejam um arquivo Test.
Ambos include e opcache_compile_file() funcionarão, mas têm implicações
diferentes sobre como o código é tratado.
include executará o código no arquivo,
enquanto opcache_compile_file() não. Isso significa que apenas o primeiro suporta
declaração condicional (funções declaradas dentro de um bloco if).
Como include executará o código, os arquivos includes
aninhados também serão analisados e suas declarações pré-carregadas.
opcache_compile_file() pode carregar arquivos em qualquer ordem. Ou seja, se
a.php define a classe A e b.php define a classe
B que estende A, então opcache_compile_file() pode
carregar esses dois arquivos em qualquer ordem. Ao usar include, no entanto, a.php
deve ser incluído primeiro.
Em ambos os casos, se um script posterior incluir um arquivo que já foi pré-carregado,
seu conteúdo ainda será executado, mas quaisquer símbolos que ele definir não serão redefinidos. O uso de
include_once não impedirá que o arquivo seja incluído uma segunda vez. Pode
ser necessário carregar um arquivo novamente para incluir as constantes globais definidas nele, pois elas não são
tratadas pelo pré-carregamento.
Qual abordagem é melhor, portanto, depende do comportamento desejado. Com código que, de outra forma, usaria um
autoloader,
opcache_compile_file() permite maior flexibilidade. Com o código que seria
carregado manualmente,
include será mais robusta.