Preloading
Ă 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.
Il est à noter 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éfinir la valeur opcache.preload
dans php.ini :
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éfinir 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() va ĂȘtre analysĂ© et stockĂ© 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.
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é.
- include va exécuter le code du fichier,
tandis que opcache_compile_file() ne le fera pas. Cela signifie que seul le premier supporte
la déclaration conditionnelle (les fonctions déclarées à l'intérieur d'un bloc if).
- Parce que include va exécuter le code, les fichiers inclus de maniÚre
imbriquée seront également analysés et leurs déclarations préchargées.
- opcache_compile_file() peut charger des fichiers dans n'importe quel ordre. C'est-Ă -dire que si
a.php définit la classe
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.
- 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'il définit ne seront pas redéfinis. L'utilisation de
include_once n'empĂȘchera pas le fichier d'ĂȘ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.
Quelle approche est la meilleure dépend donc du comportement souhaité. Avec du code qui utiliserait autrement un
chargement automatique,
opcache_compile_file() permet une plus grande flexibilité. Avec du code qui serait
autrement chargé manuellement,
include sera plus robuste.