PHP 5.5 a été publié et il comporte un nouveau module de mise en cache de code appelé OPCache, mais il ne semble pas y avoir de documentation pour cela.
Alors, où est la documentation et comment utiliser OPcache?
Dommage que la documentation ne nous dise PAS comment compiler correctement opcache / le désactiver ni contourner l'autoconf de PHP 5.6.24+ source, afin que PHP compile! :-(
Filip OvertoneSinger Rydlo
@ Fred-ii- "Il y a beaucoup de paramètres qui peuvent avoir besoin d'être ajustés. Comprendre comment cela fonctionne et identifier les problèmes pendant la phase de stabilisation du processus de publication de PHP 5.5 sera très utile." ... Ce billet de blog n'est pas très utile. Il n'explique pas comment comprendre son fonctionnement ni comment ajuster au mieux les paramètres :(
icc97
Réponses:
371
Installation
OpCache est compilé par défaut sur PHP5.5 +. Cependant, il est désactivé par défaut. Pour commencer à utiliser OpCache en PHP5.5 +, vous devez d'abord l'activer. Pour ce faire, vous devez procéder comme suit.
Notez également que vous devrez utiliser la zend_extensiondirective au lieu de la directive "normale" extensioncar elle affecte le moteur Zend réel (c'est-à-dire la chose qui exécute PHP).
Usage
Actuellement, il existe quatre fonctions que vous pouvez utiliser:
Renvoie un tableau contenant la configuration actuellement utilisée par OpCache. Cela inclut tous les paramètres ini ainsi que les informations de version et les fichiers sur liste noire.
Cela renverra un tableau contenant des informations sur l'état actuel du cache. Ces informations comprendront des éléments tels que: l'état du cache (activé, redémarrage, plein, etc.), l'utilisation de la mémoire, les hits, les échecs et quelques informations plus utiles. Il contiendra également les scripts mis en cache.
Certaines interfaces graphiques ont été créées pour aider à maintenir OpCache et générer des rapports utiles. Ces outils exploitent les fonctions ci-dessus.
Quelque chose en ce qui concerne PHP-CLI? Comment CLI l'utilise? Au redémarrage de FPM, OPCache se réinitialise - cela affecte-t-il également OPCache de CLI? L'OPCache de CLI est-il séparé ou partage-t-il le même pool de cache avec FPM? Merci!
Shahriyar Imanov, le
3
OpCache a été activé par défaut pour moi sur ma dernière installation sur Ubuntu 14.04, Apache 2.4.7, PHP 5.5.9.
jstats
salut, dans votre 3ème capture d'écran, cache_full est faux, je suppose que c'est lié à la mise en cache pleine page, pourriez-vous me dire comment l'activer? (rendez-vous vrai)
brucekaushik
Je me trompe, ce n'est pas pour la mise en cache de la pleine page, mais cela apparaîtra comme vrai si la mémoire que le cache utilise est pleine. Merci quand même!
brucekaushik
zend_extension = C: \ path \ to \ php_opcache.dll (win) - L'ajout de cette ligne dans php.ini fonctionne très bien.
kalidasan
152
OPcache remplace APC
Comme OPcache est conçu pour remplacer le module APC, il n'est pas possible de les exécuter en parallèle en PHP. C'est très bien pour mettre en cache l'opcode PHP car ni l'un ni l'autre n'affecte la façon dont vous écrivez le code.
Cependant, cela signifie que si vous utilisez actuellement APC pour stocker d'autres données (via la apc_store()fonction), vous ne pourrez pas le faire si vous décidez d'utiliser OPCache.
Vous devrez utiliser une autre bibliothèque telle que APCu ou Yac qui stockent les données dans la mémoire PHP partagée, ou passer à quelque chose comme memcached, qui stocke les données en mémoire dans un processus distinct pour PHP.
De plus, OPcache n'a pas d'équivalent du compteur de progression de téléchargement présent dans APC. Au lieu de cela, vous devez utiliser la progression du téléchargement de session .
Paramètres pour OPcache
La documentation pour OPcache peut être trouvée ici avec toutes les options de configuration répertoriées ici . Les paramètres recommandés sont:
; Sets how much memory to use
opcache.memory_consumption=128;Sets how much memory should be used by OPcache for storing internal strings ;(e.g. classnames and the files they are contained in)
opcache.interned_strings_buffer=8; The maximum number of files OPcache will cache
opcache.max_accelerated_files=4000;How often (in seconds) to check file timestamps for changes to the shared;memory storage allocation.
opcache.revalidate_freq=60;If enabled, a fast shutdown sequence is used for the accelerated code;The fast shutdown sequence doesn't free each allocated block, but lets;the Zend Engine Memory Manager do the work.
opcache.fast_shutdown=1;Enables the OPcache for the CLI version of PHP.
opcache.enable_cli=1
Si vous utilisez une bibliothèque ou un code qui utilise des annotations de code, vous devez activer les commentaires d'enregistrement:
opcache.save_comments=1
S'il est désactivé, tous les commentaires PHPDoc sont supprimés du code pour réduire la taille du code optimisé. La désactivation des "commentaires de doc" peut casser certaines applications et frameworks existants (par exemple Doctrine, ZF2, PHPUnit)
Ces paramètres sont-ils recommandés pour les environnements de production, pour le développement ou les deux?
marcvangend
1
Peut-être un malentendu de ma part de ce qu'est exactement opcache et à quoi il sert, mais je l'ai configuré et testé avec le script d'état PeeHaa ci-dessous. Tout fonctionne. Mais je pose toujours la question OP. "Comment l'utiliser?" Ce n'est pas pour mettre en cache les vues et les choses n'est-ce pas?
isimmons
3
@isimmons "OPcache améliore les performances PHP en stockant le bytecode de script précompilé dans la mémoire partagée, supprimant ainsi la nécessité pour PHP de charger et d'analyser les scripts à chaque demande."
Danack
1
@marcvangend Bon point! Je pense que la mise en cache n'a de sens que dans la production, donc ces configurations sont probablement des paramètres de production.
Sliq
3
Quelqu'un peut-il expliquer pourquoi les performances des paramètres recommandés sont pires que celles par défaut ou quand ils devraient commencer à donner effet?
RP
19
Je vais déposer mes deux cents pour ce que j'utilise opcache.
J'ai créé un cadre complet avec beaucoup de champs et de méthodes de validation et d'énumérations pour pouvoir parler à ma base de données.
Sans opcache
Lorsque j'utilise ce script sans opcache et que je pousse 9000 requêtes en 2,8 secondes vers le serveur apache, il atteint un maximum de 90-100% cpu pendant 70-80 secondes jusqu'à ce qu'il rattrape toutes les requêtes.
Total time taken: 76085 milliseconds(76 seconds)
Avec opcache activé
Avec opcache activé, il fonctionne à un temps de 25-30% cpu pendant environ 25 secondes et ne dépasse jamais l'utilisation de 25% cpu.
Total time taken: 26490 milliseconds(26 seconds)
J'ai créé un fichier de liste noire opcache pour désactiver la mise en cache de tout sauf le cadre qui est tout statique et n'a pas besoin de changer de fonctionnalité. Je choisis explicitement uniquement les fichiers de framework afin de pouvoir développer sans me soucier de recharger / valider les fichiers cache. Tout avoir mis en cache permet d'économiser une seconde sur le total des demandes25546 milliseconds
Cela augmente considérablement la quantité de données / demandes que je peux gérer par seconde sans même que le serveur sue.
zend_extension=php_opcache.dll; opcache.memory_consumption=128; opcache.interned_strings_buffer=8; opcache.max_accelerated_files=4000; opcache.revalidate_freq=60; opcache.fast_shutdown=1; opcache.enable_cli=1; opcache.blacklist_filename="C:\xampp\php\cfg\opcache.blacklist;Remplacez simplement le; avec une entrée dans le fichier ini. Mais c'est ce que j'ai utilisé. surtout des trucs par défaut
Tschallacka
1
btw, moi exécutant cela avec memcache faisant 2100 demandes de base de données une seconde exécute le script que j'utilise dans 150 microsecondes (environ
1/6 de
1
Opcache met en cache les fichiers php sous forme compilée en mémoire. Ainsi, vous n'avez plus de temps de lecture depuis le disque et de compilation et d'optimisation des fichiers par l'analyseur php. Memcache est quelque chose que vous pouvez utiliser pour stocker des variables entre les sessions. Par exemple, un utilisateur dispose d'un script de mise à jour qui demande les mêmes paramètres pendant 10 secondes pendant que l'utilisateur regarde ascreen. Vous pouvez utiliser le cache mem pour compiler la requête une fois, puis continuer à demander la requête compilée à partir de la mémoire avant de la régénérer.
Tschallacka
2
ce n'est pas le cas. opcache.revalidate_freq=60;détermine la durée de vie d'un fichier en mémoire en secondes. lorsque le temps est écoulé, il recompile le fichier.
Tschallacka
3
En fait, opcache.revalidate_freqcontrôle la fréquence de vérification des modifications d'un script (selon que son horodatage a changé). Donc, si l'horodatage d'un script reste le même que la dernière fois qu'il a été compilé, il ne sera pas recompilé. Tout cela suppose que vous n'avez pas modifié le opcache.validate_timestampsparamètre, qui est activé par défaut.
jjlin
4
Avec PHP 5.6 sur Amazon Linux (devrait être le même sur RedHat ou CentOS):
Réponses:
Installation
OpCache est compilé par défaut sur PHP5.5 +. Cependant, il est désactivé par défaut. Pour commencer à utiliser OpCache en PHP5.5 +, vous devez d'abord l'activer. Pour ce faire, vous devez procéder comme suit.
Ajoutez la ligne suivante à votre
php.ini
:Notez que lorsque le chemin contient des espaces, vous devez le mettre entre guillemets:
Notez également que vous devrez utiliser la
zend_extension
directive au lieu de la directive "normale"extension
car elle affecte le moteur Zend réel (c'est-à-dire la chose qui exécute PHP).Usage
Actuellement, il existe quatre fonctions que vous pouvez utiliser:
opcache_get_configuration()
:Renvoie un tableau contenant la configuration actuellement utilisée par OpCache. Cela inclut tous les paramètres ini ainsi que les informations de version et les fichiers sur liste noire.
opcache_get_status()
:Cela renverra un tableau contenant des informations sur l'état actuel du cache. Ces informations comprendront des éléments tels que: l'état du cache (activé, redémarrage, plein, etc.), l'utilisation de la mémoire, les hits, les échecs et quelques informations plus utiles. Il contiendra également les scripts mis en cache.
opcache_reset()
:Réinitialise l'intégralité du cache. Cela signifie que tous les scripts en cache possibles seront à nouveau analysés lors de la prochaine visite.
opcache_invalidate()
:Invalide un script mis en cache spécifique. Cela signifie que le script sera à nouveau analysé lors de la prochaine visite.
Maintenance et rapports
Certaines interfaces graphiques ont été créées pour aider à maintenir OpCache et générer des rapports utiles. Ces outils exploitent les fonctions ci-dessus.
OpCacheGUI
Disclaimer Je suis l'auteur de ce projet
Fonctionnalités:
Captures d'écran:
URL: https://github.com/PeeHaa/OpCacheGUI
opcache-status
Fonctionnalités:
Capture d'écran:
URL: https://github.com/rlerdorf/opcache-status
opcache-gui
Fonctionnalités:
Capture d'écran:
URL: https://github.com/amnuts/opcache-gui
la source
OPcache remplace APC
Comme OPcache est conçu pour remplacer le module APC, il n'est pas possible de les exécuter en parallèle en PHP. C'est très bien pour mettre en cache l'opcode PHP car ni l'un ni l'autre n'affecte la façon dont vous écrivez le code.
Cependant, cela signifie que si vous utilisez actuellement APC pour stocker d'autres données (via la
apc_store()
fonction), vous ne pourrez pas le faire si vous décidez d'utiliser OPCache.Vous devrez utiliser une autre bibliothèque telle que APCu ou Yac qui stockent les données dans la mémoire PHP partagée, ou passer à quelque chose comme memcached, qui stocke les données en mémoire dans un processus distinct pour PHP.
De plus, OPcache n'a pas d'équivalent du compteur de progression de téléchargement présent dans APC. Au lieu de cela, vous devez utiliser la progression du téléchargement de session .
Paramètres pour OPcache
La documentation pour OPcache peut être trouvée ici avec toutes les options de configuration répertoriées ici . Les paramètres recommandés sont:
Si vous utilisez une bibliothèque ou un code qui utilise des annotations de code, vous devez activer les commentaires d'enregistrement:
la source
Je vais déposer mes deux cents pour ce que j'utilise opcache.
J'ai créé un cadre complet avec beaucoup de champs et de méthodes de validation et d'énumérations pour pouvoir parler à ma base de données.
Sans opcache
Lorsque j'utilise ce script sans opcache et que je pousse 9000 requêtes en 2,8 secondes vers le serveur apache, il atteint un maximum de 90-100% cpu pendant 70-80 secondes jusqu'à ce qu'il rattrape toutes les requêtes.
Total time taken: 76085 milliseconds(76 seconds)
Avec opcache activé
Avec opcache activé, il fonctionne à un temps de 25-30% cpu pendant environ 25 secondes et ne dépasse jamais l'utilisation de 25% cpu.
Total time taken: 26490 milliseconds(26 seconds)
J'ai créé un fichier de liste noire opcache pour désactiver la mise en cache de tout sauf le cadre qui est tout statique et n'a pas besoin de changer de fonctionnalité. Je choisis explicitement uniquement les fichiers de framework afin de pouvoir développer sans me soucier de recharger / valider les fichiers cache. Tout avoir mis en cache permet d'économiser une seconde sur le total des demandes
25546 milliseconds
Cela augmente considérablement la quantité de données / demandes que je peux gérer par seconde sans même que le serveur sue.
la source
zend_extension=php_opcache.dll; opcache.memory_consumption=128; opcache.interned_strings_buffer=8; opcache.max_accelerated_files=4000; opcache.revalidate_freq=60; opcache.fast_shutdown=1; opcache.enable_cli=1; opcache.blacklist_filename="C:\xampp\php\cfg\opcache.blacklist;
Remplacez simplement le; avec une entrée dans le fichier ini. Mais c'est ce que j'ai utilisé. surtout des trucs par défautopcache.revalidate_freq=60;
détermine la durée de vie d'un fichier en mémoire en secondes. lorsque le temps est écoulé, il recompile le fichier.opcache.revalidate_freq
contrôle la fréquence de vérification des modifications d'un script (selon que son horodatage a changé). Donc, si l'horodatage d'un script reste le même que la dernière fois qu'il a été compilé, il ne sera pas recompilé. Tout cela suppose que vous n'avez pas modifié leopcache.validate_timestamps
paramètre, qui est activé par défaut.Avec PHP 5.6 sur Amazon Linux (devrait être le même sur RedHat ou CentOS):
puis redémarrez apache.
la source
Je l'ai rencontré lors de la configuration de Moodle. J'ai ajouté les lignes suivantes dans le fichier php.ini.
intl -> http://php.net/manual/en/book.intl.php
la source
opcache.fast_shutdown = 0
github.com/zendtech/ZendOptimizerPlus/issues/146