In diesem Artikel zeigen wir auf, wie man Zend OpCache für Drupal einrichtet. Der PHP Bytecode-Cache Zend OpCache wurde im März 2013 von Zend Optimizer+ in Zend OpCache umbenannt. Es ist nun Open Source (quelloffen und frei verfügbar) und wird ab PHP 5.5 standardmässig mitgeliefert.
PHP kompiliert den Quelltext in dem Augenblick, in dem das PHP Skript ausgeführt wird. Der kompilierte Quelltext wird PHP Bytecode genannt, welcher dann von PHP ausgeführt wird. Ein Bytecode-Cache speichert dieses kompilierten Quelltext im Shared Memory (Hauptspeicher) für eine definierte Zeitdauer, wodurch der Kompiliiervorgang wegfällt und der Ladeprozess deutlich schnell durchgeführt wird. Dies führt zu einer Performance-Steigerung die bis zu 70% mehr Anfragen pro Sekunde bedeuten kann.
Voraussetzung für die folgende Anleitung:
- Debian 7 (Wheezy)
- Drupal 7
Zend OpCache mit PHP 5.5
PHP 5.5 kann mit Drupal 7 eingesetzt werden. Alle contrib Module, die auch mit PHP 5.4 funktioniert haben, funktionieren auch mit PHP 5.5. Mit PHP 5.5 wird erstmalig ein OpCache mitgeliefert. Das bedeutet, dass auf eine zusätzliche Installation z.B. via PECL für APC, XCACHE oder ähnliches verzichtet werden kann. PHP 5.5 wird mit Zend OpCache ausgeliefert und dieser ist auch standardmässig schon aktiv. Um PHP 5.5 mit Debian Wheezy zu verwenden, muss die Datei /etc/apt/sources.list um die folgenden Zeilen erweitert werden:
# Dotdeb packages for php5.5
deb http://packages.dotdeb.org wheezy all
deb-src http://packages.dotdeb.org wheezy all
deb http://packages.dotdeb.org wheezy-php55 all
deb-src http://packages.dotdeb.org wheezy-php55 all
Dadurch sind nun die Pakete von Dotdeb nutzbar. Nun wird das schon installierte PHP mit der PHP Version 5.5 aktualisiert:
apt-get update && apt-get upgrade
Für eine bessere Performance, sind nun noch folgende Parameter in der php.ini zu setzen:
; 128 MB Hauptspeicher verwenden
opcache.memory_consumption=128
; 8MB Speicher für den String Buffer
opcache.interned_strings_buffer=8
; Maximale Anzahl an Hash Key des OpCaches
opcache.max_accelerated_files=4000
; Alle 60 Sekunden überprüfen, ob sich der Zeitstempel der Datei geändert hat
opcache.revalidate_freq=60
; Auch für PHP CLI soll der OpCache verwendet werden (also auch mit Drush)
opcache.enable_cli=1
; Es wird nicht jeder allokierte Speicherblock freigegeben, sondern dies wird mit dem Zend Engine Memory Manager durchgeführt
opcache.fast_shutdown=1
Überprüfen, ob Zend OpCache richtig arbeitet
Um festzustellen, ob Zend OpCache überhaupt aktiv ist, prüft man innerhalb der phpinfo Ausgabe von PHP folgende Werte im Abschnitt Zend OPcache:
Opcode Caching => Up and Running
Optimization => Enabled
Startup => OK
Werden diese Werte angezeigt, ist Zend OpCache aktiv.
Um sich eine grafische Ausgabe für die Speicherauslastung zu verschaffen, kann man entweder OpCache Control Panel oder OpCache Status verwenden.
Beispiel der Ausgabe von OpCache Control Panel:
Beispiel der Ausgabe von OpCache Status:
Was es zu beachten gibt
Hier einige Hinweise zur Konfiguration:
opcache.save_comments=0
Mit dieser Einstellung kann man Zend OpCache dazu veranlassen, dass die PHP Kommentare nicht in dem Cache landen (also zur Zeit der Ausführung des Codes nicht mehr vorhanden sind). Dies bedeutet, dass keine Code Annotations mehr funktionieren. Mit Drupal 7 werden aktuell keine Annotations verwendet, dies sieht wahrscheinlich bei Drupal 8 anders aus. Für Drupal 8 werden Annotations für die Beschreibung der Plugins verwendet, und dann muss diese Einstellung auf opcache.save_comments=1 gesetzt werden (was auch die Standardeinstellung von PHP ist).
opcache.enable_file_override=1
Durch diese Einstellung können Performance-Gewinne erreicht werden indem Funktionen, welche die Zugriffe auf Dateien überprüfen (wie file_exists, is_file oder is_readable) auf den OpCache zurück greifen. Dadurch können Fehlerverhalten seitens Drupal auftreten, wenn opcache.revalidate_freq einen zu hohen Wert hat, oder über opcache.validate_timestamps die Veränderung von Dateien abgeschaltet wird. Normalerweise ändern sich nur PHP Dateien auf dem Webserver, wenn neue Dateien deployed werden. Will man also die Performance-Gewinne erhalten, kann man durch einen Neustart des Webservers (bei mod_php) oder des PHP Dienstes (z.B. bei PHP FPM) Fehler ausschliessen.
preg_replace() /e modifier is deprecated
Einige Contrib Drupal Module verwenden noch den e Modifier mit preg_replace, welcher nicht mehr eingesetzt werden soll. Anstelle dessen ist die PHP Funktion preg_replace_callback zu verwenden. Zu einigen Modulen wie Views Slideshow werden schon Patches angeboten. Die überholte Funktion läuft zwar noch, allerdings werden Notice Meldungen ausgegeben (welche übrigens bei einer Seite im produktiven Einsatz nie ausgegeben werden sollten). Dieser Hinweis bezieht sich auf PHP 5.5 und nicht auf den Zend OpCache.
Einsatz in Shared Hosting Umgebungen
Über PHP können die Funktionen mit dem Präfix opcache_ verwendet werden (z.B. opcache_reset), welches in einer Shared Hosting Umgebung zu Sicherheitsproblemen oder Fehlverhalten der Anwendungen führen kann. Will man in Shared Hosting Umgebung den Zend OpCache einsetzen, empfiehlt sich diese Funktionen mit der disable_functions Direktive in der php.ini zu deaktivieren. Definition zu Shared Hosting: Hierbei teilen sich viele Kunden gemeinsam einen Server und eine IP-Adresse. Nachteile einer Shared Hosting Umgebung sind vor allem die durch Überlastung verursachten Leistungseinbrüche, die während der sogenannten Spitzenzeiten auftreten.
Zend OpCache mit älteren PHP Versionen
Zend OpCache kann ab PHP Version 5.2 verwendet werden. Verwendet man eine ältere Version als PHP 5.5, kann man Zend OpCache über die verfügbare PECL Version installieren:
pecl install ZendOpcache
Mit dieser Vorgehensweise muss auch noch manuell innerhalb der php.ini (oder einer include Datei zur php.ini) die Erweiterung aktiviert werden.
Vergleich Zend OpCache und APC
Vorteile von Zend OpCache
- Bessere Performance von 5 bis 20%, siehe Benchmark-Ergebnisse
- Bessere Verfügbarheit. Da Zend OpCache mit PHP selbst ausgeliefert wird, ist Zend OpCache auch sofort mit einer neuen PHP Version verfügbar.
- Bessere Zuverlässigkeit durch zusätzliche Datenprüfungen, um Fehlverhalten auf C Ebene zu verhindern
- Bessere Kompatibilität. Zend OpCache sollte mit jeder Art PHP Code umgehen können. Der PHP Code verhält sich genauso als ohne Zend OpCache
Vorteile von APC
- Caching für User Daten. Diese Funktion bietet Zend OpCache nicht an, kann aber durch Erweiterungen wie APCu oder memcache/memcached eingesetzt werden.
- Kann nicht mehr bestehende PHP Skripte cachen. Aufgrund einer anderen Arbeitsweise kann dies Zend OpCache nicht leisten.
Quellen und Referenzen
Wir bieten Performance Monitoring an unterstützen Sie dabei, dass Ihre Anwendungen die Bedürfnisse der Besucher und Anwender erfüllen.