<?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 => 'fr',
  ),
  '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 => 'Configuration &agrave; l\'ex&eacute;cution',
  ),
  'next' => 
  array (
    0 => 'ref.opcache.php',
    1 => 'Fonctions OPcache',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    '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">
  À partir de PHP 7.4.0, PHP peut être configuré pour précharger des scripts dans l&#039;opcache lorsque le moteur
  démarre. Toutes les fonctions, classes, interfaces ou traits (mais pas les constantes) de ces fichiers deviendront
  alors disponibles globalement pour toutes les requêtes sans avoir besoin d&#039;être explicitement incluses. Cela échange
  la commodité et les performances (car le code est toujours disponible) contre l&#039;utilisation de la mémoire de base. Cela
  nécessite également de redémarrer le processus PHP pour effacer les scripts préchargés, ce qui signifie que cette fonctionnalité
  n&#039;est pratique qu&#039;en production, pas dans un environnement de développement.
 </p>

 <p class="simpara">
  Il est à noter que le compromis optimal entre les performances et la mémoire peut varier en fonction de l&#039;application.
  &quot;Tout précharger&quot; peut être la stratégie la plus simple, mais pas nécessairement la meilleure. De plus,
  le préchargement n&#039;est utile que lorsqu&#039;il y a un processus persistant d&#039;une requête à une autre. Cela signifie
  que bien que cela puisse fonctionner dans un script CLI si l&#039;opcache est activé, c&#039;est généralement inutile. L&#039;exception
  est lors de l&#039;utilisation du préchargement sur les <a href="ffi.examples-complete.php" class="link">bibliothèques FFI</a>.
 </p>

 <blockquote class="note"><p><strong class="note">Note</strong>: 
  <span class="simpara">
   Le préchargement n&#039;est pas supporté sur Windows.
  </span>
 </p></blockquote>

 <p class="simpara">
  La configuration du préchargement implique deux étapes, et nécessite que l&#039;opcache soit activé.
  Tout d&#039;abord, définissez la valeur <a href="opcache.configuration.php#ini.opcache.preload" class="link">opcache.preload</a>
  dans <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> est un fichier arbitraire qui sera exécuté une fois au démarrage du serveur
  (PHP-FPM, mod_php, etc.) et chargera du code en mémoire persistante. Dans les serveurs qui démarrent en tant que
  root avant de passer à un utilisateur système non privilégié, ou si PHP est exécuté en tant que root
  (non recommandé), la valeur <a href="opcache.configuration.php#ini.opcache.preload-user" class="link">opcache.preload_user</a>
  peut spécifier l&#039;utilisateur système pour exécuter le préchargement. L&#039;exécution du préchargement en tant que root n&#039;est pas autorisée
  par défaut. Définir <code class="literal">opcache.preload_user=root</code> pour l&#039;autoriser explicitement.
 </p>

 <p class="simpara">
  Dans le script <var class="filename">preload.php</var>, tout fichier référencé par <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> va être analysé et stocké dans la mémoire persistante. Dans l&#039;exemple suivant,
  tous les fichiers <var class="filename">.php</var> du répertoire <var class="filename">src</var> seront préchargés, sauf s&#039;ils
  sont un fichier <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">
  <span class="function"><a href="function.include.php" class="function">include</a></span> et <span class="function"><a href="function.opcache-compile-file.php" class="function">opcache_compile_file()</a></span> fonctionneront tous les deux, mais ont des
   implications différentes pour la façon dont le code est géré.

  <ul class="itemizedlist">
   <li class="listitem"><span class="simpara"><span class="function"><a href="function.include.php" class="function">include</a></span> va exécuter le code du fichier,
    tandis que <span class="function"><a href="function.opcache-compile-file.php" class="function">opcache_compile_file()</a></span> ne le fera pas. Cela signifie que seul le premier supporte
    la déclaration conditionnelle (les fonctions déclarées à l&#039;intérieur d&#039;un bloc if).</span></li>
    <li class="listitem"><span class="simpara">Parce que <span class="function"><a href="function.include.php" class="function">include</a></span> va exécuter le code, les fichiers inclus de manière
    imbriquée seront également analysés et leurs déclarations préchargées.</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> peut charger des fichiers dans n&#039;importe quel ordre. C&#039;est-à-dire que si
    <var class="filename">a.php</var> définit la classe <code class="literal">A</code> et <var class="filename">b.php</var> définit la classe
    <code class="literal">B</code> qui étend <code class="literal">A</code>, alors <span class="function"><a href="function.opcache-compile-file.php" class="function">opcache_compile_file()</a></span> peut
    charger ces deux fichiers dans n&#039;importe quel ordre. Lors de l&#039;utilisation de <span class="function"><a href="function.include.php" class="function">include</a></span>, cependant,
    <var class="filename">a.php</var> <em>doit</em> être inclus en premier.</span></li>
   <li class="listitem"><span class="simpara">Dans les deux cas, si un script ultérieur inclut un fichier qui a déjà été préchargé, alors
    son contenu sera toujours exécuté, mais les symboles qu&#039;il définit ne seront pas redéfinis. L&#039;utilisation de
    <span class="function"><a href="function.include-once.php" class="function">include_once</a></span> n&#039;empêchera pas le fichier d&#039;être inclus une seconde fois. Il peut être nécessaire
    de charger un fichier à nouveau pour inclure les constantes globales définies en lui, car elles ne sont pas
    gérées par le préchargement.</span></li>
  </ul>

  Quelle approche est la meilleure dépend donc du comportement souhaité. Avec du code qui utiliserait autrement un
  chargement automatique, <span class="function"><a href="function.opcache-compile-file.php" class="function">opcache_compile_file()</a></span> permet une plus grande flexibilité. Avec du code qui serait
  autrement chargé manuellement, <span class="function"><a href="function.include.php" class="function">include</a></span> sera plus robuste.
 </p>

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