Files
archived-doc-pt-br/reference/opcache/preload.xml
Leonardo Lara Rodrigues 17d859faaf sync line numbers with en rev
2026-01-23 09:16:58 -03:00

124 lines
6.1 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 87d6bb1bbd5f118f5b0cf0160438f06c0f91ea45 Maintainer: fernandowobeto Status: ready --><!-- CREDITS: marcosmarcolin,fernandowobeto,leonardolara -->
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="opcache.preloading">
<title>Preloading</title>
<simpara>
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.
</simpara>
<simpara>
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 <link linkend="ffi.examples-complete">bibliotecas FFI</link>.
</simpara>
<note>
<simpara>
O pré-carregamento não é suportado no Windows.
</simpara>
</note>
<simpara>
A configuração do pré-carregamento envolve duas etapas e requer que o opcache esteja ativado.
Primeiro, defina o valor <link linkend="ini.opcache.preload">opcache.preload</link>
em &php.ini;:
</simpara>
<informalexample>
<programlisting role="ini">
<![CDATA[
opcache.preload=preload.php
]]>
</programlisting>
</informalexample>
<simpara>
<filename>preload.php</filename> é 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 <link linkend="ini.opcache.preload-user">opcache.preload_user</link>
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 <literal>opcache.preload_user=root</literal> para permiti-lo explicitamente.
</simpara>
<simpara>
No script <filename>preload.php</filename>, qualquer arquivo referenciado por <function>include</function>,
<function>include_once</function>, <function>require</function>, <function>require_once</function> ou
<function>opcache_compile_file</function> será analisado na memória persistente. No exemplo a seguir,
todos os arquivos <filename class="extension">.php</filename> no diretório <filename>src</filename> serão pré-carregados, a menos que
sejam um arquivo <literal>Test</literal>.
</simpara>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$directory = new RecursiveDirectoryIterator(__DIR__ . '/src');
$fullTree = new RecursiveIteratorIterator($directory);
$phpFiles = new RegexIterator($fullTree, '/.+((?<!Test)+\.php$)/i', RecursiveRegexIterator::GET_MATCH);
foreach ($phpFiles as $key => $file) {
require_once $file[0];
}
?>
]]>
</programlisting>
</informalexample>
<para>
Ambos <function>include</function> e <function>opcache_compile_file</function>&gt; funcionarão, mas têm implicações
diferentes sobre como o código é tratado.
<itemizedlist>
<listitem><simpara><function>include</function> executará o código no arquivo,
enquanto <function>opcache_compile_file</function> não. Isso significa que apenas o primeiro suporta
declaração condicional (funções declaradas dentro de um bloco if).</simpara></listitem>
<listitem><simpara>Como <function>include</function>executará o código, os arquivos <function>include</function>s
aninhados também serão analisados e suas declarações pré-carregadas.</simpara></listitem>
<listitem><simpara><function>opcache_compile_file</function> pode carregar arquivos em qualquer ordem. Ou seja, se
<filename>a.php</filename> define a classe <literal>A</literal> e <filename>b.php</filename> define a classe
<literal>B</literal> que estende <literal>A</literal>, então <function>opcache_compile_file</function> pode
carregar esses dois arquivos em qualquer ordem. Ao usar <function>include</function>, no entanto, <filename>a.php</filename>
<emphasis>deve</emphasis> ser incluído primeiro.</simpara></listitem>
<listitem><simpara>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
<function>include_once</function> 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.</simpara></listitem>
</itemizedlist>
Qual abordagem é melhor, portanto, depende do comportamento desejado. Com código que, de outra forma, usaria um
autoloader, <function>opcache_compile_file</function> permite maior flexibilidade. Com o código que seria
carregado manualmente, <function>include</function> será mais robusta.
</para>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->