Maison >développement back-end >tutoriel php >Analyse approfondie du fonctionnement 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.
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.
Étape 2 : Demande => Nginx
Étape 3 : Nginx => PHP-FPM
Étape 4 : PHP-FPM Master = > Worker
Étape 5 : PHP-FPM Worker => Master => Nginx
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 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 ?
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 OpcachexCache : 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 :
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
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 fichiersUn 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.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 OPCacheOPCache 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 :
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.
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 ?
opcache_compile_file ()
Effectuer la mise en cache de compilationopcache_compile_file()
进行编译缓存6.1 内存配置
opcache.preferred_memory_model="mmap"
OPcache 首选的内存模块。如果留空,OPcache 会选择适用的模块, 通常情况下,自动选择就可以满足需求。可选值包括: mmap
,shm
, 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 表示缓存全部文件。默认值06.3 注释相关的缓存
opcache.load_comments
boolean
如果禁用,则即使文件中包含注释,也不会加载这些注释内容。 本选项可以和 opcache.save_comments
一起使用,以实现按需加载注释内容。opcache.fast_shutdown
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.
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!