Comment utiliser PHP OPCache?


249

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.

Ajoutez la ligne suivante à votre php.ini:

zend_extension=/full/path/to/opcache.so (nix)
zend_extension=C:\path\to\php_opcache.dll (win)

Notez que lorsque le chemin contient des espaces, vous devez le mettre entre guillemets:

zend_extension="C:\Program Files\PHP5.5\ext\php_opcache.dll"

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:

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.

var_dump(opcache_get_configuration());

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.

var_dump(opcache_get_status());

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_reset();

opcache_invalidate():

Invalide un script mis en cache spécifique. Cela signifie que le script sera à nouveau analysé lors de la prochaine visite.

opcache_invalidate('/path/to/script/to/invalidate.php', true);

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:

  • Statut OpCache
  • Configuration d'OpCache
  • Statistiques OpCache
  • Réinitialisation d'OpCache
  • Présentation des scripts mis en cache
  • Invalidation des scripts mis en cache
  • Multilingue
  • Prise en charge des appareils mobiles
  • Graphiques brillants

Captures d'écran:

statut

scripts en cache

graphiques

mobilr

URL: https://github.com/PeeHaa/OpCacheGUI

opcache-status

Fonctionnalités:

  • Statut OpCache
  • Configuration d'OpCache
  • Statistiques OpCache
  • Présentation des scripts mis en cache
  • Un seul fichier

Capture d'écran:

statut

URL: https://github.com/rlerdorf/opcache-status

opcache-gui

Fonctionnalités:

  • Statut OpCache
  • Configuration d'OpCache
  • Statistiques OpCache
  • Réinitialisation d'OpCache
  • Présentation des scripts mis en cache
  • Invalidation des scripts mis en cache
  • Rafraîchissement automatique

Capture d'écran:

opcache-gui-overview

URL: https://github.com/amnuts/opcache-gui


6
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)


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


3
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):

yum install php56-opcache

puis redémarrez apache.


2

Je l'ai rencontré lors de la configuration de Moodle. J'ai ajouté les lignes suivantes dans le fichier php.ini.

zend_extension=C:\xampp\php\ext\php_opcache.dll

[opcache]
opcache.enable = 1
opcache.memory_consumption = 128
opcache.max_accelerated_files = 4000
opcache.revalidate_freq = 60

; Required for Moodle
opcache.use_cwd = 1
opcache.validate_timestamps = 1
opcache.save_comments = 1
opcache.enable_file_override = 0

; If something does not work in Moodle
;opcache.revalidate_path = 1 ; May fix problems with include paths
;opcache.mmap_base = 0x20000000 ; (Windows only) fix OPcache crashes with event id 487

; Experimental for Moodle 2.6 and later
;opcache.fast_shutdown = 1
;opcache.enable_cli = 1 ; Speeds up CLI cron
;opcache.load_comments = 0 ; May lower memory use, might not be compatible with add-ons and other apps

extension=C:\xampp\php\ext\php_intl.dll

[intl]
intl.default_locale = en_utf8
intl.error_level = E_WARNING

intl -> http://php.net/manual/en/book.intl.php


1
Il convient de noter que ces paramètres sont documentés ici: docs.moodle.org/30/en/OPcache
sierrasdetandil

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.