<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/book.opcache.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'pt_BR',
  ),
  'this' => 
  array (
    0 => 'opcache.preloading.php',
    1 => 'Preloading',
    2 => 'Preloading',
  ),
  'up' => 
  array (
    0 => 'book.opcache.php',
    1 => 'OPcache',
  ),
  'prev' => 
  array (
    0 => 'opcache.configuration.php',
    1 => 'Configura&ccedil;&otilde;es em Execu&ccedil;&atilde;o',
  ),
  'next' => 
  array (
    0 => 'ref.opcache.php',
    1 => 'Fun&ccedil;&otilde;es de OPcache',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'pt_BR',
    'path' => 'reference/opcache/preload.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="opcache.preloading" class="chapter">
 <h1 class="title">Preloading</h1>


 <p class="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.
 </p>

 <p class="simpara">
  Observe que a compensação ideal entre desempenho e memória pode variar de acordo com o aplicativo.
  &quot;Pré-carregar tudo&quot; 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 <a href="ffi.examples-complete.php" class="link">bibliotecas FFI</a>.
 </p>

 <blockquote class="note"><p><strong class="note">Nota</strong>: 
  <span class="simpara">
   O pré-carregamento não é suportado no Windows.
  </span>
 </p></blockquote>

 <p class="simpara">
  A configuração do pré-carregamento envolve duas etapas e requer que o opcache esteja ativado.
  Primeiro, defina o valor <a href="opcache.configuration.php#ini.opcache.preload" class="link">opcache.preload</a>
  em <var class="filename">php.ini</var>:
 </p>

 <div class="informalexample">
  <div class="example-contents">
<div class="inicode"><pre class="inicode">opcache.preload=preload.php</pre>
</div>
  </div>

 </div>

 <p class="simpara">
  <var class="filename">preload.php</var> é 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 <a href="opcache.configuration.php#ini.opcache.preload-user" class="link">opcache.preload_user</a>
  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 <code class="literal">opcache.preload_user=root</code> para permiti-lo explicitamente.
 </p>

 <p class="simpara">
  No script <var class="filename">preload.php</var>, qualquer arquivo referenciado por <span class="function"><a href="function.include.php" class="function">include</a></span>,
  <span class="function"><a href="function.include-once.php" class="function">include_once</a></span>, <span class="function"><a href="function.require.php" class="function">require</a></span>, <span class="function"><a href="function.require-once.php" class="function">require_once</a></span> ou
  <span class="function"><a href="function.opcache-compile-file.php" class="function">opcache_compile_file()</a></span> será analisado na memória persistente. No exemplo a seguir,
  todos os arquivos <var class="filename">.php</var> no diretório <var class="filename">src</var> serão pré-carregados, a menos que
  sejam um arquivo <code class="literal">Test</code>.
 </p>

 <div class="informalexample">
  <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$directory </span><span style="color: #007700">= new </span><span style="color: #0000BB">RecursiveDirectoryIterator</span><span style="color: #007700">(</span><span style="color: #0000BB">__DIR__ </span><span style="color: #007700">. </span><span style="color: #DD0000">'/src'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$fullTree </span><span style="color: #007700">= new </span><span style="color: #0000BB">RecursiveIteratorIterator</span><span style="color: #007700">(</span><span style="color: #0000BB">$directory</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$phpFiles </span><span style="color: #007700">= new </span><span style="color: #0000BB">RegexIterator</span><span style="color: #007700">(</span><span style="color: #0000BB">$fullTree</span><span style="color: #007700">, </span><span style="color: #DD0000">'/.+((?&lt;!Test)+\.php$)/i'</span><span style="color: #007700">, </span><span style="color: #0000BB">RecursiveRegexIterator</span><span style="color: #007700">::</span><span style="color: #0000BB">GET_MATCH</span><span style="color: #007700">);<br /><br />foreach (</span><span style="color: #0000BB">$phpFiles </span><span style="color: #007700">as </span><span style="color: #0000BB">$key </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$file</span><span style="color: #007700">) {<br />    require_once </span><span style="color: #0000BB">$file</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">];<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
  </div>

 </div>

 <p class="para">
  Ambos <span class="function"><a href="function.include.php" class="function">include</a></span> e <span class="function"><a href="function.opcache-compile-file.php" class="function">opcache_compile_file()</a></span>&gt; funcionarão, mas têm implicações
  diferentes sobre como o código é tratado.

  <ul class="itemizedlist">
   <li class="listitem"><span class="simpara"><span class="function"><a href="function.include.php" class="function">include</a></span> executará o código no arquivo,
    enquanto <span class="function"><a href="function.opcache-compile-file.php" class="function">opcache_compile_file()</a></span> não. Isso significa que apenas o primeiro suporta
    declaração condicional (funções declaradas dentro de um bloco if).</span></li>
   <li class="listitem"><span class="simpara">Como <span class="function"><a href="function.include.php" class="function">include</a></span>executará o código, os arquivos <span class="function"><a href="function.include.php" class="function">include</a></span>s
    aninhados também serão analisados e suas declarações pré-carregadas.</span></li>
   <li class="listitem"><span class="simpara"><span class="function"><a href="function.opcache-compile-file.php" class="function">opcache_compile_file()</a></span> pode carregar arquivos em qualquer ordem. Ou seja, se
    <var class="filename">a.php</var> define a classe <code class="literal">A</code> e <var class="filename">b.php</var> define a classe
    <code class="literal">B</code> que estende <code class="literal">A</code>, então <span class="function"><a href="function.opcache-compile-file.php" class="function">opcache_compile_file()</a></span> pode
    carregar esses dois arquivos em qualquer ordem. Ao usar <span class="function"><a href="function.include.php" class="function">include</a></span>, no entanto, <var class="filename">a.php</var>
    <em>deve</em> ser incluído primeiro.</span></li>
   <li class="listitem"><span class="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
    <span class="function"><a href="function.include-once.php" class="function">include_once</a></span> 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.</span></li>
  </ul>

  Qual abordagem é melhor, portanto, depende do comportamento desejado. Com código que, de outra forma, usaria um
  autoloader, <span class="function"><a href="function.opcache-compile-file.php" class="function">opcache_compile_file()</a></span> permite maior flexibilidade. Com o código que seria
  carregado manualmente, <span class="function"><a href="function.include.php" class="function">include</a></span> será mais robusta.
 </p>

</div>
<?php manual_footer($setup); ?>