Welchen PHP (Opcode) Cache sollte man verwenden und warum?

44

Ich höre immer wieder von PHP (Opcode) -Caches wie APC, XCache, Memcache, eAccelerator usw.

Aber ich konnte nie herausfinden, wie ich mich für eine entscheiden sollte. Neben dem Leistungsvorteil, den ein Caching-System bieten soll, sollten auch andere Faktoren von Bedeutung sein.

Warum ist das X-Cache-System besser als Y? Ich mache mir weniger Sorgen um den relativen Leistungszuwachs. Kleine Unterschiede zwischen zwei beliebigen Systemen sind weniger wichtig.

Wenn eine generische Antwort auf meine Frage nicht möglich ist, finden Sie hier einige Hinweise. Ich benutze dedizierte VPS mit Mediatemple (mit Root-Zugriff). RAM ist 512 MB (physisch) + 400 MB (Swap) Ich mache mir Sorgen um WordPress und seine Cousins ​​WordPress-MU und BuddyPress. 90% unserer Codes / Websites gehören zur WordPress-Familie.

Vielen Dank im Voraus für etwas Hilfe.

rahul286
quelle

Antworten:

33

Die Produkte, die Sie auflisten, dienen unterschiedlichen Zwecken.

OPCode-Caches

Es gibt viele PHP-Beschleuniger (OPCaches), die in dieser Wikipedia-Liste aufgeführt sind . Wie bei Open-Source-Produkten üblich, sind sie alle ziemlich ähnlich. XCache ist der Lighttp-PHP-Beschleuniger und die Standardeinstellung, wenn Sie dieses HTTPd ausführen. Es funktioniert auch gut mit Apache, jedoch scheint APC etwas besser zu sein, da es sozial gesehen "gut mit anderen zusammenarbeitet", offiziell als Teil von PHP unterstützt wird und im Einklang mit der offiziellen PHP-Distribution veröffentlicht wird.

Ich habe den Einsatz von eAccelerator aufgegeben, da er sich verlangsamt und den Veröffentlichungen von PHP hinterherhinkt. Der offizielle Status, den APC bietet, ist vergleichbar.

Diese Produkte sind in der Regel Drop-In; Kein sofortiger Leistungsschub durch Codeänderung. Bei großen Codebasen (Drupal, Wordpress) kann die Leistung bis zu dreimal besser sein, während die Antwortzeit und der Speicherbedarf gesenkt werden.

Daten-Caching

Memcache ist ein etwas anderes Produkt - Sie können es sich als leichtes Schlüsselwertsystem vorstellen, das auf mehrere Server skaliert werden kann . Die Software muss verbessert werden, um Memcache zu unterstützen, und löst bestimmte Probleme besser als andere. Wenn Ihre Website eine Liste mit Echtzeitaktienwerten enthält, können Sie Memcache verwenden, um eine residente Liste mit dem aktuellen Wert zu erstellen, der auf Ihrer Website angezeigt wird. Sie können es verwenden, um Sitzungsdaten für die kurzfristige Wiederverwendung zu speichern. Sie würden es nicht für andere Dinge wie Ganzseiten-Caches oder als Ersatz für MySQL verwenden.

Es gibt auch Wordpress-Addons wie WP-Super-Cache , die die Leistung von Wordpress drastisch verbessern können (tatsächlich kann WP-Super-Cache in vielen Fällen mit statischen HTML-basierten Sites mithalten).

Zusammenfassend kann ich sagen, dass ich APC wärmstens empfehlen würde, wenn Sie ein "Set it and forget it, gut unterstütztes Produkt" möchten.

SirStan
quelle
Diese Antwort wird auf Meta diskutiert: meta.stackexchange.com/questions/15474/…
Brad Gilbert
Füllen Sie " [4]: http://" aus, um das Problem zu beheben.
Brad Gilbert
Vielen Dank SirStan! Ihre Antwort hat nicht nur mein Problem gelöst, sondern mir auch geholfen, einen besseren Einblick in die Caching-Welt zu bekommen. Ich möchte Sie nur noch etwas fragen. Ich benutze bereits wp-supercache. Ist es eine gute Idee, es mit APC zu kombinieren? Wird APC die Leistung weiter deutlich verbessern? Arbeiten APC und Wp-SuperCache zusammen? Brauche ich beide? Oder macht APC Wp-SuperCache überflüssig?
Rahul286
Hinweis: APC führt sowohl die Daten- als auch die Op-Code-Zwischenspeicherung durch.
lo_fye
2
Diese Antwort ist jetzt sehr veraltet. Es ist unwahrscheinlich, dass APC für zukünftige Versionen von PHP aktualisiert wird, da es seit Version 5.5 durch Zends Optimierer und Opcode-Cache (jetzt als Opcache bekannt) ersetzt wurde. Ich habe jedoch keinen wesentlichen Unterschied in der Leistung festgestellt ( symcbean.blogspot.co.uk/2013/09/… ). Außerdem kann die mangelnde Datenunterstützung im Opcache und die fehlende Speicherfreigabe dazu führen, dass Upgrades für einige unproduktiv werden.
Symcbean
6

APC wird in PHP6 integriert, daher ist dies eine logische Entscheidung. Ich benutze es und der Leistungsschub ist erstaunlich. Wenn Sie etwas anderes als Opcodes (z. B. Datenbank-Abfrageergebnisse) zwischenspeichern müssen, können Sie auch APC verwenden, es ist jedoch nicht möglich, APC-Caches zwischen mehreren Servern zu teilen. Wenn Sie nur auf einem einzigen Server zwischenspeichern müssen, ist APC großartig. Wenn Sie auf mehrere Server skalieren und einen Cache gemeinsam nutzen möchten, ist memcached Ihr Mann.

Eine Sache, die ich jedoch tun würde, ist, eine Wrapper-Klasse für jedes (Nicht-Opcode-) Caching zu erstellen, das Sie durchführen. Auf diese Weise können Sie die Caching-Engine austauschen, ohne Ihren Code zu ändern.

lo_fye
quelle
BEEINDRUCKEND. Wenn ich den offiziellen Status von APC gewusst hätte, wäre ich langfristig zurückgekehrt ... :-) Ich wusste auch nicht viel über den Unterschied zwischen Opcode- und Nicht-Opcode-Cache. Als persönliche Entscheidung möchte ich nicht den Aufwand zum Erstellen von Wrapper-Klassen oder zum Ändern der Quelle meiner Apps in Kauf nehmen, um sie bei der Anpassung an die Caching-Umgebung zu unterstützen.
rahul286
6
Beachten Sie, dass PHP 5.5 den Zend Opcache als "offiziellen" Opcode-Cache integriert hat. Ich halte es für unwahrscheinlich, dass sie für PHP 6 auf APC umsteigen.
Matteo Tassinari
1
Um dies zu korrigieren: PHP 5.5 wird in der Tat mit Zend Opcache ausgeliefert. Es wird kein PHP 6 geben. Stattdessen wird es ein PHP 7 geben. APC ist fast (?) Obsolet.
Jisse Reitsma
6

Nur um festzustellen, dass sich die Dinge ein wenig geändert haben und es den Anschein hat, dass APC nicht in PHP 6 Core enthalten sein wird.

APC hat eine langsame Entwicklung und es sieht so aus, als würde es niemals mit PHP 5.5 kompatibel sein. Aus diesem Grund werden wohl Leute von PHP die Zend OPCache-Opcode-Cache-Erweiterung als PHP CORE-Erweiterung festlegen. Lesen Sie hier mehr darüber http://wiki.php.net/rfc/optimizerplus .

Wichtiger Hinweis: Zend OPCache verfügt nicht über einen Benutzerdaten-Cache wie APC. Wenn Sie also einen Benutzerdaten-Cache benötigen, können Sie diesen zusammen mit Memcache verwenden.

Nemke
quelle
1
Außerdem wird der gesamte Cache ungültig, wenn er voll ist (ungültige Einträge werden NICHT entfernt). Wenn Sie also mehr Code als Speicher haben oder häufig bereitstellen, müssen Sie mit Leistungsspitzen rechnen.
Symcbean
3

Wenn Sie mindestens die PHP-Version 5.50 ausführen, ist OpCache die beste Wahl (native PHP / PECL-Bibliothek). Es sollte vorkompiliert sein, wenn es aus einer Binärdatei installiert wird.

http://php.net/manual/en/book.opcache.php

Wenn Sie eine PHP-Version vor 5.5 ausführen, ist APC (PHP / PECL-nativer OpCode-Cache) die einfachste Wahl, obwohl dies als nicht gepflegt und tot angesehen wird:

http://php.net/manual/en/book.apc.php

Die Verwendung der nativen OpCache-Funktionalität von PHP erspart Ihnen die Pflege von Bibliotheken von Drittanbietern.

rekursieren
quelle
1
Wenn Sie PHP <5.5 ausführen, sollten Sie es als erstes aktualisieren.
Michael Hampton
@ michael-hampton :: In der Tat! In einigen seltenen Fällen können Sie PHP jedoch nicht aktualisieren, ohne das Betriebssystem zu aktualisieren, was sogar eine neue Hardwareanforderung bedeuten kann. Beispiel - Ich arbeite für ein Unternehmen, das IBM i-Series-Server der Version 6somethings ausführt. Unsere PHP-Version ist 5.4.3. Da IBM für die Portierung von PHP-Versionen auf Zend zurückgreift, erfordert PHP 5.6 eine neuere Version von IBM-i OS - 7.1 oder neuer (und anschließend eine neuere Version des Zend-PHP-Servers), für die neue Power-8-Server usw. erforderlich sind ... meh.
Rekurs
0

Memcache speichert Schlüssel / Wert-Paare zwischen, keine Opcodes. Sie können es zusammen mit einem der Opcode-Caches verwenden.

user10699
quelle
Aus der Antwort von SirStan (siehe unten) geht hervor, dass ich in memcache möglicherweise meine PHP-Apps ändern muss. Eigentlich verwende ich Wordpress und es ist keine gute Idee, den Kerncode zu ändern.
Rahul286