2012-10-12 8 views
14

Das Internet hat viele Diskussionen, dass das Aufrufen von apc_cache_clear() in CLI Opcode-Caches von PHP-Prozessen im Web nicht löscht, unabhängig davon, ob sie in Apache oder FPM ausgeführt werden (siehe How to clear APC cache entries?). Als eine vorgeschlagene Lösung ist es möglich, eine einfache PHP-Seite zu erstellen, die apc_cache_clear() aufruft und diese von CLI aus aufruft. Symfony's ApcBundle macht das.Wird der APC-Opcode-Cache zwischen PHP-FPM-Pools/Arbeitern geteilt?

Wenn die apc_cache_clear() von CLI nicht den Cache von Apache/FPM leeren, ist es zwischen FPM Arbeiter? Wenn ich /clear_apc_cache.php über HTTP aufruft, wird es nur von einem der FPM-Worker-Prozesse ausgeführt. Also, ist der APC-Opcode-Cache wirklich zwischen Pools und Arbeiter geteilt - und genauer: Ist es von allen Arbeitern automatisch gelöscht?

+1

Standard auslassen Soweit ich FPM und APC verstehen, ich glaube, dass sie geteilt werden. Sie haben im Grunde eine Instanz von PHP ausgeführt. Daher nur eine Instanz von APC. – tubaguy50035

+0

Danke @ tubaguy50035 für einen Kommentar. Ich denke, ich muss noch etwas nachforschen, um sicher zu sein ... –

Antwort

22

Alle php-fpm-Worker teilen sich den gleichen Opcode-Cache wie der parent php-fpm-Prozess; source. Wenn Sie eine /apc_clear_cache.php -Datei haben und Sie diese über HTTP aufrufen (mit etwas wie curl), löschen Sie den Opcode-Cache für alle Worker, die denselben php-fpm Master-Prozess verwenden.

Diese blog article hat eine sehr gute Erklärung, wie apc funktioniert und wie es während der Veröffentlichung effektiv gelöscht wird.

+0

Danke für die Beantwortung der Frage mit guten Quellen. Das hat mein Problem geklärt. =) –

+1

Wie oben beschrieben (http://stackoverflow.com/a/12981832/1447317) sollten Sie den APC-Cache im Kontext der HTTP-Anforderung löschen, jedoch wird der Cache für ** alle ** Pools gelöscht aus demselben Master-Prozess gespalten (dies ist typisch für die meisten Distributionen). – boda2004

+2

Ich denke, die untergeordneten Prozesse werden vom selben Master-Prozess gespalten, auch wenn sie sich in verschiedenen Pools befinden, daher gibt es nur einen gemeinsam genutzten APC-Cache. Eine Möglichkeit, um zu arbeiten, besteht darin, verschiedene php-fpm Master-Prozesse zu starten. –

3

Ich habe gerade festgestellt, dass verschiedene Pools auch den gleichen APC-Cache teilen, zumindest in PHP 5.4 mit FPM und soweit der Inhalt des Opcode-Caches betroffen ist. Diese

ist, wie ich es bemerkt:

Ich habe mehrere PHP-FPM-Pools eingerichtet, in dem jeder Pool unter /srv/www/domain.com/ Verzeichnis chrooted wird.

Der Hauptort für PHP-Skripte ist /srv/www/domain.com/docroot/.

Nun, wenn ich eine Datei /srv/www/domain_1.com/docroot/test.php erstellen und das Skript laden, zeigt es, was es zeigen soll.

Wenn ich jedoch die Datei /srv/www/domain_2.com/docroot/test.php erstelle, wird der Inhalt auch unter domain_1.com angezeigt.

Ich denke, das passiert, weil APC den Speicherort der Datei als Schlüssel für seinen Cache verwendet, und in beiden Fällen ist der Schlüssel /docroot/test.php.

Das Löschen des Opcode-Caches ist möglicherweise auf einen einzelnen Pool beschränkt. Ich habe das allerdings nicht getestet.

BEARBEITEN Das Löschen des Opcode-Caches wird nicht auf einen einzelnen App-Pool zurückgeführt, der vollständige APC-Cache wird gelöscht, wenn apc_cache_clear() aufgerufen wird.

Ich habe auch versucht, apc.mmap_file_mask verwenden, um eine andere Maske für jeden Pool anzugeben. Das änderte nichts, Updates in einem App-Pool-Dateien wurden in anderen Pools gesehen.

Dieses Verhalten wurde mit der Einstellung apc.stat = 0 beobachtet. Alle Änderungen an Dateien werden mit lsyncd überwacht, wodurch eine erneute Kompilierung des Eintrags im APC-Cache erzwungen wird.

  • Tero
+1

Kiitos Tero - soweit ich die [Antwort oben] (http://stackoverflow.com/a/12981832/769144) verstanden habe, scheint es, dass der Opcode-Cache den Hauptprozess gehört, also ist dieses Verhalten Art von erwartet ... außer dass definitiv der gesamte Quelldateipfad der Schlüssel sein sollte. Ich muss das auch in meinem eigenen Setup testen. –

11

Sie können über die cli den Opcode-Cache löschen, ohne die Dateien auf Ihrer Website bereitstellen, wenn Sie das Skript über die Schnittstelle direkt FastCGI auszuführen.

Ich habe this gist erstellt, die Sie auf Ihren Servern verwenden können, um den php5-fpm Cache zu löschen.

Wenn Sie mit Unix-Sockets:

php clear-apc.php --sock /var/run/php5-fpm.sock

Ansonsten:

php clear-apc.php --port=[port]

oder für 127.0.0.1:9000

+0

Danke! Dies ist im allgemeinen sehr nützlich und könnte ohne weiteres auch für die Cache-Erwärmung und andere ähnliche Operationen im Anwendungsserver verwendet werden. –

+0

Tolle Idee - vielleicht sogar diese Fähigkeit :) –

+0

Gist existiert nicht mehr :-( – richsage