A partir de PHP 7.4.0, PHP peut être configuré pour précharger des scripts dans l'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'être explicitement incluses. Cela échange la commodité et les performances (car le code est toujours disponible) contre l'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'est pratique qu'en production, pas dans un environnement de développement.
Notez que le compromis optimal entre les performances et la mémoire peut varier en fonction de l'application. "Tout précharger" peut être la stratégie la plus simple, mais pas nécessairement la meilleure. De plus, le préchargement n'est utile que lorsqu'il y a un processus persistant d'une requête à une autre. Cela signifie que bien que cela puisse fonctionner dans un script CLI si l'opcache est activé, c'est généralement inutile. L'exception est lors de l'utilisation du préchargement sur les bibliothèques FFI.
Note:
Le préchargement n'est pas supporté sur Windows.
La configuration du préchargement implique deux étapes, et nécessite que l'opcache soit activé. Tout d'abord, définissez la valeur opcache.preload dans php.ini :
opcache.preload=preload.php
preload.php 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 opcache.preload_user
peut spécifier l'utilisateur système pour exécuter le préchargement. L'exécution du préchargement en tant que root n'est pas autorisée
par défaut. Définissez opcache.preload_user=root
pour l'autoriser explicitement.
Dans le script preload.php, tout fichier référencé par include,
include_once, require, require_once, ou
opcache_compile_file() vont être parsés dans la mémoire persistante. Dans l'exemple suivant,
tous les fichiers .php du répertoire src seront préchargés, sauf s'ils
sont un fichier Test
.
<?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];
}
?>
include et opcache_compile_file() fonctionneront tous les deux, mais ont des implications différentes pour la façon dont le code est géré.
A
et b.php définit la classe
B
qui étend A
, alors opcache_compile_file() peut
charger ces deux fichiers dans n'importe quel ordre. Lors de l'utilisation de include, cependant,
a.php doit être inclus en premier.