OPcache PHP Bootup Optimierung

Bei Webseiten, die beispielsweise auf WordPress, Joomla oder Laravel basieren und keinen userspezifischen Content haben, empfiehlt es sich, alle Seiten in einem statischen HTML-Cache vorzuhalten und den Cache nur bei Änderung im Backend manuell (oder automatisch) neu zu generieren. Beinhaltet die Seite jedoch dynamische Inhalte, die abhängig von Sessions und Cookies oder auch Sprache und Ort abhängen, eignet sich der Einsatz von OPcache.


Dabei liegt die sog. Boot Time bei allen drei genannten Systemen bei einem frisch aufgesetzten CentOS7-Server (mit SSD und PHP 7.1) bei über 100 ms. Jedes Mal, wenn ein PHP-Script ausgeführt wird, muss dieses zur Laufzeit in Bytecode kompiliert werden. OPcache realisiert nun einen Cache für diesen Bytecode – wird nun beim nächsten Request dasselbe PHP-Script ausgeführt, muss es nicht rekompiliert werden. Nach dem Aktivieren von OPcache setzen wir folgende Einstellungen:

9006cec6c5d3d2498ee26c5bfd91590a

Die Ausführungszeit (gemittelt bei 10 Ausführungen) hat sich nun deutlich reduziert:

WordPress 4.7.4 Joomla 3.7 Laravel 5.4
ohne OPcache 295 ms 201 ms 110 ms
mit OPcache 54 ms 59 ms 13 ms
Faktor 5,5 3,5 8,5

Da wir bei den Einstellung validate_timestamps auf 0 und gleichzeitig revalidate_freq auf die Dauer von einem Tag gesetzt haben, wird der Cache quasi nie automatisch neu aufgebaut (das machen wir bewusst manuell). Mit einem kleinen Git-Hook wird bei jedem "pull" ein PHP-Script ausgeführt. So aktiviert man den Hook:

a1678610c8b4c7db5997375944183830

a1678610c8b4c7db5997375944183830

Folgende Helferfunktion ist außerdem behilflich, um einzelne Code-Teile (oder die gesamte Ausführungszeit) zu messen:

085f4291bbcc4e8a64bbea951ff49ab9

Will man hilfreiche Infos wie Status, genutzten Memory oder gecachte Filezahl erhalten, nutzt man diese PHP-Funktion:

3f6309d04bc7e48dd909859321b96209

Um in den Genuss von OPcache auch in einer lokalen Entwicklungsumgebung zu kommen (was generell nicht empfehlenswert ist), bedienen wir uns eines Tricks.

OPcache ist auf allen Servern, die das OPcache-Modul installiert haben und bei denen die Einstellung opcache.enable nicht explizit gesetzt ist, aktiv. Das lassen wir auch so. Wir setzen lediglich in der php.ini opcache.validate_timestamps = 1. Damit greift opcache.revalidate_freq = 2. Damit erreichen wir, dass bei jedem Projekt OPcache quasi ständig revalidiert. Bei denjenigen Projekten, bei denen wir OPcache dauerhaft aktivieren wollen, setzen wir projektbezogen in der .htaccess folgende Einstellung:

1dd64a3f2fe4425b29b1409410fe3fc0

Danach starten wir den Webserver neu und legen folgendes Script an:

91fb5289160e410607c9ea89112a575b

Dieses Script löscht den Cache und baut ihn gleichzeitig neu auf. Nun setzen wir im Lieblingseditor VSCode ein workspace-bezogenes RunOnSave-Kommando fest:

91fb5289160e410607c9ea89112a575b

Zurück