Est APC cache d'opcode partagé entre PHP-FPM piscines ou les travailleurs?
Internet a beaucoup de discussions que l'appel apc_cache_clear()
dans l'interface de ligne n'est pas clair caches d'opcode de "web" de processus PHP, si elles sont exécutées à l'intérieur d'Apache ou par FPM (voir Comment faire pour effacer les entrées du cache APC? ). Une proposition de solution, il est possible de créer une simple page PHP qui appelle apc_cache_clear()
, et l'appeler à partir de la CLI. Symfony est ApcBundle fait.
Si le apc_cache_clear()
à partir de la CLI ne se vide pas le cache d'Apache/FPM, il entre FPM travailleurs? Si je l'appelle /clear_apc_cache.php sur HTTP, il est dirigé par seulement par l'un des FPM processus de travail. Donc, est l'APC cache d'opcode vraiment partagé entre les piscines et les travailleurs - et plus précis: est-il effacé de tous les travailleurs automatiquement?
Merci @tubaguy50035 pour un commentaire. Je pense que j'ai besoin de faire plus de recherche pour être sûr...
OriginalL'auteur Ville Mattila | 2012-10-12
Vous devez vous connecter pour publier un commentaire.
Tous les php-fpm travailleurs partagent le même cache d'opcode en tant que parent php-fpm processus; source. Si vous avez un /apc_clear_cache.php fichier et vous l'appelez sur HTTP (en utilisant quelque chose comme curl), vous pourrez effacer le cache d'opcode pour tous les travailleurs à l'aide de la même php-fpm processus maître.
Ce article du blog a une très bonne explication de la façon dont apc fonctionne et comment les éliminer efficacement au cours de la libération.
Comme l'écrit au-dessus vous devriez vider le cache APC dans le contexte de la requête HTTP, cependant, il va vider le cache pour tous piscines, qui sont fourche de même processus maître (ce qui est typique pour la plupart des distributions).
Je pense que le processus fils sont fourche à partir de la même maîtriser le processus même qu'ils sont dans les différents bassins, donc il n'y a qu'une cache apc. Une façon de contourner est de commencer différentes de php-fpm maîtrise des processus.
Vous avez raison! La fonction realpath cache local pour les travailleurs, et non pas le cache apc. Je vais mettre à jour ma réponse.
Votre réponse est toujours indiqué "Il n'est pas partagé entre les pools;" ce qui est incorrect, comme les commentaires ci-dessus ont indiqué, si les piscines sont de la même maîtrise de PHP-FPM processus les pools de partager le cache d'opcode. En outre, la mise en cache de compensation n'est pas limitée à la piscine, il va vider le cache pour toutes les piscines qui proviennent de la même mère PHP-FPM processus.
OriginalL'auteur Herman J. Radtke III
Vous pouvez effacer le cache d'opcode via la cli, sans avoir à déployer les fichiers de votre site web si vous exécutez le script via le FastCGI interface directement.
J'ai créé ce gist que vous pouvez utiliser sur vos serveurs pour effacer le php5-fpm cache.
Si vous êtes en utilisant les sockets unix:
php clear-apc.php --sock /var/run/php5-fpm.sock
Autrement:
php clear-apc.php --port=[port]
ou de les omettre pour défaut
127.0.0.1:9000
Excellente idée – peut même intégrer cette capacité 🙂
Gist n'existe plus 🙁
Fixe – j'ai changé mon profil
si j'obtiens ce message d'erreur lors d'exécuter le script
Primary script unknown
?OriginalL'auteur Stuart Carnie
J'ai juste trouvé que les différents bassins partagent également le même cache APC, au moins en PHP 5.4 avec FPM et aussi loin que le cache opcode contenu.
C'est ainsi que j'ai remarqué:
J'ai mis en place plusieurs PHP-FPM des piscines, où chaque piscine est chrooté dans /srv/www/domaine.com/annuaire.
L'emplacement principal pour les scripts PHP est /srv/www/domaine.com/docroot/.
Maintenant, si je crée un fichier /srv/www/domain_1.com/docroot/test.php et de charger le script, il montre ce qu'il doit afficher.
Cependant, quand j'ai créer le fichier /srv/www/domain_2.com/docroot/test.php le contenu d'un spectacle sous domain_1.com.
Je pense que cela arrive à cause de l'APC utilise l'emplacement du fichier de la clé de son cache, et dans les deux cas, la clé est /docroot/test.php.
De compensation de l'opcode cache peut-être restreinte à une seule piscine. Je n'ai pas testé cette même si.
MODIFIER de Compensation de l'opcode cache n'est pas restircted à une simple application de la piscine, l'ensemble de la APC cache est effacé lorsque apc_cache_clear() est appelée.
J'ai aussi essayé d'utiliser apc.mmap_file_mask pour spécifier un masque différent pour chaque pool. Cela n'a rien changé, les mises à jour dans un pool d'applications fichiers ont été observés dans d'autres piscines.
Ce comportement a été observé avec les apc.stat=0 réglage. Toutes les modifications apportées aux fichiers sont suivis avec lsyncd, forçant une recompilation de l'entrée dans le cache APC.
OriginalL'auteur Tero Kilkanen