Maison >développement back-end >tutoriel php >Analyse approfondie du fonctionnement de PHP Opcache

Analyse approfondie du fonctionnement de PHP Opcache

藏色散人
藏色散人avant
2022-01-05 14:01:444297parcourir

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, ainsi que 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 va démarrer deux types de processus : le processus principal et le processus de travail. gérant Workers. Process ; ce dernier est le programme cgi de PHP, qui est responsable de l'interprétation, de la compilation et de l'exécution des scripts PHP.
  • Démarrez Nginx. Tout d'abord, le module ngx_http_fastcgi_module sera chargé, initialisant l'environnement d'exécution FastCGI et implémentant 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 de 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 le 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. Si il n'y a pas de Worker inactif, une erreur 502 est renvoyée
  • Worker (php-. cgi) le processus exécute le script PHP si expire, renvoie une erreur 504
  • Le traitement est terminé, renvoie le résultat

Étape 5 : PHP-FPM Worker => Master => Nginx

  • PHP -Le processus FPM Worker renvoie le résultat du traitement et ferme la connexion, en attente de la prochaine requête
  • Le processus maître PHP-FPM renvoie le résultat du traitement via Socket
  • Le gestionnaire Nginx envoie séquentiellement chaque tampon de réponse au premier filtre → le second → et ainsi on → 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 avoir compris le flux de traitement global de PHP + Nginx, jetons un coup d'œil au flux d'exécution spécifique de PHP scripts.

Prenons d'abord un exemple :

<?php
if (!empty($_POST)) {
    echo "Response Body POST: ", json_encode($_POST), "\n";
}

if (!empty($_GET)) {
    echo "Response Body GET: ", json_encode($_GET), "\n";
}

Analysons le processus d'exécution :

  • php initialise le lien d'exécution, démarre le moteur Zend, charge le module d'extension enregistré

  • Après l'initialisation, le fichier de script est lu et le moteur Zend effectue une exécution lexicale. analyse (lex) sur le fichier script ), Grammar Analysis (BISON). En mode PHP cli, à chaque fois qu'un script PHP est exécuté, les quatre étapes seront exécutées en séquence

  • 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 de syntaxe et l'opcode. généré par les étapes 2) et 3), le même script PHP aura le même résultat à chaque exécution, En mode PHP-FPM, chaque requête doit être traitée une fois, ce qui représente un énorme gaspillage de ressources système. y a-t-il un moyen de l'optimiser ?

  • Bien sûr, il y en a, 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 opcode PHP ouvert et gratuit ; composant de mise en cache, utilisé pour la mise en cache, optimise le code intermédiaire PHP ; n'est plus mis à jour, non recommandé

    APCu : c'est une branche d'APC, mémoire partagée, met en cache les données utilisateur, ne peut pas mettre en cache l'opcode, peut être utilisé avec Opcache
eAccelerate : également n'est plus mis à jour, non recommandé

xCache : Il n'est plus recommandé d'utiliser

2 Introduction à OPCache

OPCache est une extension de cache d'opcode ouverte et gratuite officiellement produite par Zend. éliminant le besoin de charger et d'analyser les scripts PHP à chaque fois.

L'extension OPcache a été intégrée à PHP 5.5.0 et versions ultérieures.

Cache deux types de contenu :

  • OPCode
  • Chaîne interne, telle que les commentaires, les noms de variables, etc.
  • 3. Principe OPCache
  • Le mécanisme principal de la mise en cache OPCache est :

Mettez le compilé. L'opcode dans la mémoire partagée est fourni 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 ont des problèmes de verrouillage.

3.1 Mémoire partagée

  • Le système UNIX/Linux offre de nombreuses façons de partager la mémoire entre les processus :
API shm System-V : mémoire partagée System V,

sysv shm est persistant sauf s'il s'agit d'un processus. explicitement supprimé, sinon il existera toujours en mémoire jusqu'à l'arrêt du système ;

API mmap : La mémoire mappée par mmap n'est pas persistante si le processus est arrêté, le mappage deviendra invalide à moins qu'il n'ait été mappé. à l'avance. Sur un fichier

Le mécanisme de mappage de mémoire mmap est un appel système standard POSIX. Il existe deux types de mappage anonyme et de mappage de fichiers

Un avantage majeur de mmap est qu'il mappe le fichier à l'espace d'adressage du processus.

évite d'avoir à transférer les données du tampon utilisateur vers le processus de copie du tampon de cache des pages du noyau Bien sûr, un autre avantage est que des appels système fréquents en lecture/écriture ne sont pas nécessaires

API POSIX : La mémoire partagée du System V est obsolète, la mémoire partagée POSIX offre une utilisation plus simple, une API conçue de manière plus rationnelle.
  • API de 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.
  • Basée sur le scénario de mise en cache du bytecode PHP, la conception de 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
  • Les opérations d'écriture sont effectuées en même temps et les opérations de lecture ne sont pas bloquées, de sorte qu'il y ait est rarement une situation de blocage.

Cela conduit à un autre problème : un nouveau code, des scénarios de trafic important, des processus en file d'attente pour effectuer des opérations d'opcode de cache ; des écritures répétées 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éliorez 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 Cache OPCode

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 Cache de chaîne interne

Nous devons d'abord comprenez, qu'est-ce qu'Interned String ?

Dans PHP5.4, le mécanisme Interned String a été introduit pour optimiser le stockage et le traitement des chaînes par PHP.

Particulièrement lorsqu'il s'agit de gros morceaux de chaînes, tels que les documents PHP, Interned String peut optimiser la mémoire.

Le contenu mis en cache des chaînes internes comprend : Noms de variables, noms de classes, noms de méthodes, chaînes, 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 de grandes sections de commentaires, qui seront également mises en cache dans OPCache.

Vous pouvez désactiver la mise en cache des commentaires via la configuration de php.ini.

Cependant, dans des frameworks comme Zend Framework, fera référence aux annotations, donc la désactivation de la mise en cache des annotations doit ê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.

Notez 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 entraînera la création répétée de nouveaux caches par un grand nombre de processus. Par conséquent, Ne définissez pas le délai d'expiration d'OPCache

Chaque fois que vous publiez un nouveau code, 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 par lots les URL d'accès PHP ou l'utilisation d'API exposées par OPCache tel que opcache_compile_file () Effectuer la mise en cache de compilationopcache_compile_file() 进行编译缓存

6. OPCache 的配置

6.1 内存配置

  • opcache.preferred_memory_model="mmap" OPcache 首选的内存模块。如果留空,OPcache 会选择适用的模块, 通常情况下,自动选择就可以满足需求。可选值包括: mmapshm, posix 以及 win32
  • opcache.memory_consumption=64 OPcache 的共享内存大小,以兆字节为单位,默认64M
  • opcache.interned_strings_buffer=4 用来存储临时字符串的内存大小,以兆字节为单位,默认4M
  • opcache.max_wasted_percentage=5 浪费内存的上限,以百分比计。 如果达到此上限,那么 OPcache 将产生重新启动续发事件。默认5

6.2 允许缓存的文件数量以及大小

  • opcache.max_accelerated_files=2000 OPcache 哈希表中可存储的脚本文件数量上限。 真实的取值是在质数集合 { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 } 中找到的第一个大于等于设置值的质数。 设置值取值范围最小值是 200,最大值在 PHP 5.5.6 之前是 100000,PHP 5.5.6 及之后是 1000000。默认值2000
  • opcache.max_file_size=0 以字节为单位的缓存的文件大小上限。设置为 0 表示缓存全部文件。默认值0

6.3 注释相关的缓存

  • opcache.load_comments boolean 如果禁用,则即使文件中包含注释,也不会加载这些注释内容。 本选项可以和 opcache.save_comments 一起使用,以实现按需加载注释内容。
  • opcache.fast_shutdown
6. Configuration d'OPCache

6.1 Configuration de la mémoire

🎜🎜. 🎜opcache. Preferred_memory_model="mmap" 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 La taille de la mémoire partagée d'OPcache, en mégaoctets, par défaut 64M🎜🎜opcache.interned_strings_buffer=4 La taille de la mémoire utilisé pour stocker des chaînes temporaires, en mégaoctets, par défaut 4M🎜🎜opcache.max_wasted_percentage=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 pouvant être mis en cache🎜🎜🎜🎜🎜opcache.max_accelerated_files=2000 Hachage OPcache table Nombre maximum de fichiers de script pouvant être stockés dans . 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 du paramètre est 200, la valeur maximale avant PHP 5.5.6 est 100000 et PHP 5.5.6 et versions ultérieures est 1000000 code> . Valeur par défaut <code>2000🎜🎜opcache.max_file_size=0 La taille de fichier maximale du 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_comments booléen Si désactivé, même si le fichier contient les commentaires et leur contenu ne seront pas chargés. 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 la 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 配置二级缓存目录并启用二级缓存。 启用二级缓存可以在 SHM 内存满了、服务器重启或者重置 SHM 的时候提高性能。 默认值为空字符串 "",表示禁用基于文件的缓存。
  • opcache.file_cache_only boolean 启用或禁用在共享内存中的 opcode 缓存。
  • opcache.file_cache_consistency_checks boolean 当从文件缓存中加载脚本的时候,是否对文件的校验和进行验证。
  • opcache.file_cache_fallback boolean 在 Windows 平台上,当一个进程无法附加到共享内存的时候, 使用基于文件的缓存,也即:opcache.file_cache_only=1
  • opcache.file_cache_only boolean Activer ou désactiver la mise en cache des opcodes dans la mémoire partagée.

opcache.file_cache_consistency_checks boolean S'il faut vérifier la somme de contrôle du fichier lors du chargement du script depuis le cache de fichiers. opcache.file_cache_fallback boolean Sur les plateformes Windows, lorsqu'un processus ne peut pas s'attacher à la mémoire partagée, un cache basé sur les fichiers est utilisé, à savoir : opcache_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