Maison  >  Article  >  développement back-end  >  Un article expliquant en détail le principe et l'utilisation de PHP opcache

Un article expliquant en détail le principe et l'utilisation de PHP opcache

藏色散人
藏色散人avant
2023-03-22 16:18:452065parcourir

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.

Un article expliquant en détail le principe et l'utilisation de PHP opcache

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.

  • 3. Le principe d'OPCache
  • 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.

  • 3.1 Mémoire partagée

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.

  • Mécanisme de mappage de mémoire mmap est un appel système standard POSIX. Il existe deux types : le mappage anonyme et le mappage de fichiers. L'un des avantages de mmap est qu'il mappe le fichier à l'espace d'adressage du processus. les données du tampon utilisateur vers le cache de la page du noyau. Le processus de copie de la zone ;

  • Bien sûr, un autre avantage est qu'il n'y a pas besoin d'appels système fréquents en lecture/écriture

  • 3. La mémoire partagée du System V est obsolète, la mémoire partagée POSIX permet l'utilisation d'une API plus simple et plus rationnelle.

    4.API du socket Unix
  • OPCache utilise les trois premiers mécanismes de mémoire partagée, en fonction de la configuration ou du mode de partage de mémoire mmap par défaut . Selon le scénario de mise en cache du bytecode PHP, la conception de la gestion de la mémoire d'OPCache est très simple, avec une lecture et une écriture rapides, aucune libération de mémoire et les données expirées sont définies comme Gaspillées.

    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é.

  • 3.2 Verrouillage Mutex

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. .

Cela conduit à un autre problème : le nouveau code, les scénarios de trafic important, les processus en file d'attente pour effectuer les opérations d'opcode du cache entraînent un gaspillage de ressources ;

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

    Chemin du fichier de script PHP
  • Script PHP OPArray
  • Structure/contenu du script PHP
  • 4.2 Chaîne interne
  • Caching Nous devons d'abord comprendre, qu'est-ce qu'une chaîne interne ?
  • Dans PHP5.4, le mécanisme Interned String a été introduit pour optimiser le stockage et le traitement des chaînes par PHP. Surtout lorsqu'il s'agit de gros blocs de chaînes, tels que les doces PHP, Interned String peut optimiser la mémoire. Le contenu du cache Interned String comprend : les noms de variables, les noms de classes, les noms de méthodes, les chaînes, les commentaires, etc.

    En mode PHP-FPM, les caractères du cache Interned String sont limités au processus Worker. Si elle est mise en cache dans OPCache, la chaîne mise en cache Interned String peut être utilisée entre les processus Worker pour économiser de la mémoire.
Nous devons prêter attention à une chose : dans le développement PHP, il y a généralement des commentaires volumineux, qui seront également mis en cache dans OPCache. La mise en cache des commentaires peut être désactivée via la configuration de php.ini.

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

est un cache qui a des stratégies d'expiration et de mise à jour. La stratégie de mise à jour d'OPCache est très simple. Les données expirées sont définies comme gaspillées. Lorsque la valeur définie est atteinte, le cache est vidé et le cache est reconstruit.

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

  • 6. Configuration d'OPCache

  • 6.1 Configuration de la mémoire
  • opcache.preferred_memory_model="mmap" Le module de mémoire préféré d'OPcache. Si laissé vide, OPcache sélectionnera le module applicable. Normalement, la sélection automatique suffira. Les valeurs facultatives incluent : mmap, shm, posix et win32.

opcache.memory_consumption=64 Taille de la mémoire partagée d'OPcache, en mégaoctets, par défaut 64M

    opcache.interned_strings_buffer=4 Taille de la mémoire utilisée pour stocker les chaînes temporaires, en mégaoctets, par défaut 4M
  • opcache.max_wasted_ pourcentage= 5 La limite supérieure de mémoire gaspillée, en pourcentage. Si cette limite est atteinte, OPcache générera un événement de redémarrage. Par défaut 5

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer