Maison > Article > développement back-end > Un article expliquant en détail le principe et l'utilisation de PHP opcache
Cet article vous apporte des connaissances pertinentes sur PHP opcache. Il explique principalement comment comprendre la fonction OPCache et comment l'utiliser. Les amis intéressés peuvent y jeter un œil ci-dessous.
Dans les projets PHP, en particulier dans les scénarios à forte concurrence et à trafic important, comment améliorer le temps de réponse de PHP est une tâche très importante.
Opcache est un composant indispensable pour optimiser les performances PHP, notamment dans les projets qui appliquent le framework PHP.
1. Présentation
Avant de comprendre la fonction OPCache, nous devons d'abord comprendre le mécanisme de fonctionnement de PHP-FPM + Nginx et le mécanisme d'interprétation et d'exécution des scripts PHP.
1.1 Mécanisme de fonctionnement de PHP-FPM + Nginx
La requête passe du navigateur Web à Nginx, puis au traitement PHP. Il y a un total de cinq étapes :
Étape 1 : Démarrez le service
. Démarrez PHP-FPM. PHP-FPM prend en charge deux modes de communication : le socket TCP et le socket Unix ;
PHP-FPM démarrera deux types de processus : le processus maître et le processus Worker. Le premier est responsable de la surveillance des ports, de l'allocation des tâches et de la gestion des processus Worker ; ce dernier Il s'agit du programme cgi de PHP, qui est chargé d'interpréter, de compiler et d'exécuter les scripts PHP.
Démarrez Nginx. Tout d'abord, le module ngx_http_fastcgi_module sera chargé pour initialiser l'environnement d'exécution FastCGI et implémenter le proxy de requête du protocole FastCGI
Remarque ici : le processus de travail fastcgi (processus cgi) est géré par PHP-FPM, pas Nginx. Nginx n'est qu'un proxy
Étape 2 : Demande => Nginx
Nginx reçoit la demande et sélectionne un gestionnaire approprié en fonction de la configuration de l'emplacement
Voici le gestionnaire pour le proxy PHP
Étape 3 : Nginx => PHP-FPM
Nginx traduit la requête en requête fastcgi
et l'envoie au processus maître de PHP-FPM via socket TCP/Socket Unix
Étape 4 : PHP-FPM Master => Worker
Le processus maître PHP-FPM reçoit la requête
et alloue le processus Worker pour exécuter le script PHP. S'il n'y a pas de Worker inactif, une erreur 502 est générée. return
Le processus Worker(php-cgi ) exécute le script PHP. S'il expire, une erreur 504 est renvoyée
Le traitement est terminé et le résultat est renvoyé
Étape 5 : PHP. -FPM Worker => Master => Nginx
PHP-FPM Le processus Worker renvoie le résultat du traitement, ferme la connexion et attend la prochaine requête
Le processus PHP-FPM Master renvoie le résultat du traitement via le Socket
Nginx Handler envoie séquentiellement chaque tampon de réponse au premier filtre → le deuxième → Et ainsi de suite → La réponse finale est envoyée au client
1.2 Le mécanisme d'explication et d'exécution du script PHP
Après compréhension le flux de traitement global de PHP + Nginx, examinons le flux d'exécution spécifique du script PHP. Tout d'abord, regardons un exemple :
<p><?php <br> if (!empty($_POST)) {<br> echo "Response Body POST: ", json_encode($_POST), "\n";<br> }<br> if (!empty($_GET)) { <br> echo "Response Body GET: ", json_encode($_GET), "\n";<br> }<br></p>
Analysons le processus d'exécution :
1.php initialise le lien d'exécution. , démarre le moteur Zend et charge le module d'extension enregistré
2. Après l'initialisation, lisez le fichier de script et le moteur Zend effectue une analyse lexicale (lex) sur le fichier de script), une analyse syntaxique (bison), génère un arbre syntaxique
3. Le moteur .Zend compile l'arbre de syntaxe, génère l'opcode,
4.Le moteur Zend exécute l'opcode, renvoie le résultat de l'exécution
En mode PHP cli, chaque fois que le script PHP est exécuté, quatre Les étapes seront exécutées dans l'ordre
En mode PHP-FPM ; , l'étape 1) est exécutée une fois au démarrage de PHP-FPM et ne sera pas exécutée dans les requêtes suivantes ; les étapes 2)~4) doivent être exécutées une fois pour chaque requête
En fait, l'arbre syntaxique et l'opcode générés aux étapes 2) et 3) aura le même résultat à chaque fois que le même script PHP sera exécuté. En mode PHP-FPM, chaque requête doit être traitée, ce qui représente un énorme gaspillage de ressources système, existe-t-il donc un moyen de l'optimiser ?
Bien sûr, il existe, comme :
OPCache : anciennement connu sous le nom de Zend Optimizer+, c'est un composant open source de Zend Server, fortement recommandé
APC : Alternative PHP Cache est un open source ; et un composant de mise en cache d'opcode PHP gratuit, utilisé pour mettre en cache et optimiser le code intermédiaire PHP ; n'est plus mis à jour et n'est pas recommandé
APCu : c'est une branche d'APC, partage la mémoire, met en cache les données utilisateur, ne peut pas mettre en cache l'opcode et peut être utilisé. avec Opcache
eAccelerate : Idem Il n'est plus mis à jour et n'est pas recommandé
Cela élimine la surcharge de chargement et d'analyse des scripts PHP à chaque fois. L'extension OPcache a été intégrée à PHP 5.5.0 et versions ultérieures.
Deux types de contenu sont mis en cache :OPCode
Chaîne interne, telle que les commentaires, les noms de variables, etc.
Le principal mécanisme de mise en cache d'OPCache est : mettre en cache. codes d'opération compilés dans la mémoire partagée pour que d'autres processus puissent y accéder. Cela implique le mécanisme de partage de mémoire. De plus, toutes les opérations sur les ressources mémoire présentent des problèmes de verrouillage. Nous les expliquerons une par une.
Les systèmes UNIX/Linux offrent de nombreuses façons de partager la mémoire entre les processus :
1. API shm System-V : mémoire partagée System V
sysv shm est persistant À moins qu'il ne soit explicitement supprimé par un processus, il existe toujours dans la mémoire. , jusqu'à l'arrêt du système ;
2.mmap API :
La mémoire mappée par mmap n'est pas persistante si le processus est fermé, le mappage deviendra invalide à moins qu'il n'ait été mappé à un fichier au préalable.
Lorsque la mémoire gaspillée est supérieure à la valeur définie, le mécanisme OPCache est automatiquement redémarré, le cache est vidé et régénéré.
Toute opération sur les ressources mémoire implique le mécanisme de verrouillage.
Mémoire partagée : un seul processus est autorisé à effectuer des opérations d'écriture dans une unité de temps, et plusieurs processus sont autorisés à effectuer des opérations de lecture ; pendant que les opérations d'écriture sont effectuées, les opérations de lecture ne sont pas bloquées, de sorte qu'il y a rarement une situation de blocage. .
4. Interprétation du cache OPCache
OPCache est la solution officielle de cache Opcode Après la version PHP5.5, elle a été empaquetée dans le code source PHP et publiée ensemble.
Il met en cache le bytecode et les données générées par la compilation PHP dans la mémoire partagée. A chaque requête, l'opcode compilé est directement lu depuis le cache et exécuté.Amélioration de l'efficacité de fonctionnement de PHP en enregistrant le processus de compilation des scripts. Si vous utilisez l'extension APC pour faire le même travail, il est désormais fortement recommandé d'utiliser plutôt OPCache, notamment en PHP7.
4.1 OPCode
Cache Opcache mettra en cache OPCode et le contenu suivant :
Fonction impliquée dans le script PHP
Classe définie dans le script PHP
Cependant, dans des frameworks tels que Zend Framework, les annotations seront référencées, donc la désactivation du cache des annotations doit donc être traitée différemment.
5. Stratégie de mise à jour OPCache
Remarque ici : dans les scénarios à fort trafic, la reconstruction du cache est une tâche très gourmande en ressources. OPCache n'empêche pas les autres processus de lire lors de la création du cache. Cela se traduit par un grand nombre de processus créant de manière répétée de nouveaux caches. Par conséquent, ne définissez pas le délai d'expiration d'OPCache
Chaque fois qu'un nouveau code est publié, le cache sera créé à plusieurs reprises. Comment l'éviter ?
Ne publiez pas de code pendant les périodes de pointe, c'est une règle qui doit être suivie en toutes circonstances
Échauffement du code, comme l'utilisation de scripts pour ajuster les URL d'accès PHP par lots, ou l'utilisation d'API exposées par OPCache tel que opcache_compile_file() pour le cache de compilation
opcache.memory_consumption=64 Taille de la mémoire partagée d'OPcache, en mégaoctets, par défaut 64M
6.2 Nombre et taille des fichiers autorisés à être mis en cache
opcache.max_accelerated_files=2000 La limite supérieure du nombre de fichiers de script pouvant être stockés dans la table de hachage OPcache. La valeur réelle est le premier nombre premier trouvé dans l'ensemble de nombres premiers {223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987} qui est supérieur ou égal à la valeur définie. La plage de valeurs minimale de la valeur de paramètre est de 200, la valeur maximale est de 100 000 avant PHP 5.5.6 et de 1 000 000 après PHP 5.5.6. Valeur par défaut 2000
opcache.max_file_size=0 Taille maximale du fichier mis en cache en octets. Définissez sur 0 pour mettre en cache tous les fichiers. Valeur par défaut 0
6.3 Cache lié aux commentaires
opcache.load_commentsboolean S'il est désactivé, le contenu du commentaire ne sera pas chargé même si le fichier contient des commentaires. Cette option peut être utilisée avec opcache.save_comments pour charger le contenu des commentaires à la demande.
opcache.fast_shutdown booléen Si activé, les événements de reprise d'arrêt rapide seront utilisés. L'événement dit de reprise d'arrêt rapide fait référence au module de gestion de mémoire qui s'appuie sur le moteur Zend pour libérer la mémoire de toutes les variables demandées en même temps, plutôt que de libérer chaque bloc de mémoire alloué en séquence.
6.4 Configuration du cache de deuxième niveau
opcache.file_cache Configurez le répertoire de cache de deuxième niveau et activez le cache de deuxième niveau. L'activation du cache L2 peut améliorer les performances lorsque la mémoire SHM est pleine, que le serveur est redémarré ou que le SHM est réinitialisé. La valeur par défaut est la chaîne vide "", qui désactive la mise en cache basée sur les fichiers.
opcache.file_cache_onlyboolean Activer ou désactiver la mise en cache des opcodes dans la mémoire partagée.
opcache.file_cache_consistency_checksboolean S'il faut vérifier la somme de contrôle du fichier lors du chargement du script à partir du cache de fichiers.
opcache.file_cache_fallbackboolean Sur les plateformes Windows, lorsqu'un processus ne peut pas être attaché à la mémoire partagée, la mise en cache basée sur les fichiers est utilisée, c'est-à-dire : opcache.file_cache_only=1. Requis pour activer la mise en cache des fichiers.
Apprentissage recommandé : "Tutoriel vidéo PHP"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!