{"id":16470,"date":"2026-03-01T23:39:00","date_gmt":"2026-03-01T22:39:00","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=16470"},"modified":"2026-04-02T17:24:54","modified_gmt":"2026-04-02T16:24:54","slug":"php-caches-performance-funktion","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/php-caches-performance-funktion\/","title":{"rendered":"PHP schneller &amp; effizienter machen: So funktionieren OPcache, Variablen-Cache, JIT &amp; co."},"content":{"rendered":"<p>Die Leistung von PHP-Anwendungen l\u00e4sst sich deutlich verbessern. Das reduziert Ladezeiten &amp; Serverlast. W\u00e4hrend der OPcache jedes PHP-Projekt ohne Anpassungen beschleunigt, wird der Zwischenspeicher f\u00fcr Variablen in den Code integriert. Dieser Artikel stellt beide Varianten sowie den neuen JIT-Compiler vor und fasst ihre Umbr\u00fcche aus der historische Entwicklung zusammen. Er soll als Einstieg dienen, um Verst\u00e4ndnis f\u00fcr die Funktionsweise von PHP aufzubauen. Sowie \u00fcber die daraus entstehenden Probleme in der Leistungsf\u00e4higkeit. So lassen sich die gefundenen L\u00f6sungen verstehen. Im zweiten Teil werden wir s\u00e4mtliche Optimierungen in der Praxis am Demo-Beispiel eines Apache-Webservers mit PHP-Modul anwenden.<\/p>\n<h2 class=\"wp-block-heading\">Die Sprache des WWW<\/h2>\n<p>Seit Jahren wird PHP f\u00fcr tot erkl\u00e4rt, weil angeblich <em>moderne<\/em> Sprachen wie JavaScript (im gleichen Jahr entstanden) sie abl\u00f6sen. Ebenso lange ist das nicht eingetroffen, im Gegenteil. Zum Stand M\u00e4rz 2026 wird PHP laut W3Techs-Erhebung auf satten 72% der Webseiten eingesetzt &#8211; und liegt damit bis heute mit gro\u00dfem Abstand auf Platz 1.<sup data-fn=\"7252e6b3-b0f4-4b1c-b1ac-88dd88e8730b\" class=\"fn\"><a href=\"#7252e6b3-b0f4-4b1c-b1ac-88dd88e8730b\" id=\"7252e6b3-b0f4-4b1c-b1ac-88dd88e8730b-link\">1<\/a><\/sup> Alle danach erreichen nur einstellige Marktanteile. Selbst das vielbeschworene JS erzielt lediglich eine Verbreitung von 5,7%. <\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/2026-03-01_23-50.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"552\" height=\"414\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/2026-03-01_23-50.jpg\" alt=\"\" class=\"wp-image-16678\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/2026-03-01_23-50.jpg 552w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/2026-03-01_23-50-300x225.jpg 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/2026-03-01_23-50-480x360.jpg 480w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/2026-03-01_23-50-227x170.jpg 227w\" sizes=\"auto, (max-width: 552px) 100vw, 552px\" \/><\/a><\/figure>\n<\/div>\n<p>Nicht nur deswegen lohnt sich eine ausf\u00fchrlichere Auseinandersetzung mit PHP: Die Skriptsprache wies zwar f\u00fcrchterliche Eigenheiten auf. Doch das hat sich seit Jahren kontinuierlich verbessert. Ab PHP 7 ist ein deutlicher Schub erkennbar. Die Verbesserungen der Sprache selbst w\u00fcrden den Rahmen sprengen und sind einen eigenen Beitrag wert. Hier soll der Fokus auf der Leistung liegen. Ein Kritikpunkt an PHP war die mangelnde Effizient. Er hatte seine Berechtigung &#8211; doch mittlerweile wurden sogar zahlreiche zuvor extern existierende Werkzeuge in den Kern der Sprache integriert, die vieles deutlich besser machen. <\/p>\n<p>Bevor du erf\u00e4hrst, was sich konkret verbessert hat, erkl\u00e4re ich die Gr\u00fcnde sowie Funktionsweise. Im sp\u00e4teren Verlauf wird auf die Konfiguration eingegangen. Schlussendlich legen wir uns eine simple Demo-Umgebung an, welche von Zwischenspeichern &amp; weiteren Optimierungen profitieren.<\/p>\n<h2 class=\"wp-block-heading\">So funktioniert PHP<\/h2>\n<p>Beide Arten funktionieren komplett unterschiedlich. Um das nachvollziehen zu k\u00f6nnen, ist ein grundlegendes Verst\u00e4ndnis davon notwendig, wie ein Webserver PHP-Anfragen abarbeitet. Das funktioniert im Wesentlichen in vier Schritten. Gehen wir von einem bekannten Apache2 mit <code class=\"\" data-line=\"\">mod_php<\/code> aus. In klassischen Webservern sind Skriptsprachen wie PHP nicht integriert, sodass diese \u00fcber ein Modul an den PHP-Interpreter weitergeleitet werden.<\/p>\n<ol class=\"wp-block-list\">\n<li>Der Browser sendet durch das Aufrufen einer Seite eine HTTP-Anfrage (GET \/demo.php)<\/li>\n<li>Der Webserver startet den PHP-Interpreter &amp; f\u00fchrt das Skript aus<\/li>\n<li>PHP erzeugt HTML als Ausgabe<\/li>\n<li>Diese Ausgabe wird vom Webserver als Antwort (HTTP Body) an den Browser gesendet<\/li>\n<\/ol>\n<p>Optimierungspotenzial besteht in Schritt 2: PHP ist eine Interpreter-Sprache. Der Code wird bei jedem Aufruf neu vom Interpreter ausgef\u00fchrt. Damit unterscheidet es sich von kompilierten Sprachen wie etwa C++ oder C: Sie werden vom Compiler einmalig in Maschinencode \u00fcbersetzt. Es entsteht eine ausf\u00fchrbare Datei, die mit hoher Leistung nutzbar ist. Interpreter-Sprachen sind flexibler, doch auch langsamer &amp; ben\u00f6tigen mehr Leistung &#8211; schlie\u00dflich muss der Interpreter bei jeder HTTP-Anfrage den PHP-Code von der Festplatte lesen und ausf\u00fchren.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/http-abfrage_php-apache.avif\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"423\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/http-abfrage_php-apache-1024x423.avif\" alt=\"\" class=\"wp-image-16674\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/http-abfrage_php-apache-1024x423.avif 1024w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/http-abfrage_php-apache-300x124.avif 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/http-abfrage_php-apache-768x317.avif 768w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/http-abfrage_php-apache-640x264.avif 640w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/http-abfrage_php-apache-412x170.avif 412w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/http-abfrage_php-apache.avif 1260w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n<h2 class=\"wp-block-heading\">OPcache macht den PHP-Interpreter effizienter<\/h2>\n<p>F\u00fcr Webseiten oder Webanwendungen ist das wenig sinnvoll. Schlie\u00dflich \u00e4ndern sich PHP-Dateien nur selten &#8211; folglich f\u00fchrt der Interpreter dutzendfach den selben Code aus. Um das zu reduzieren, erzeugt OPcache mit Bytecode eine Zwischenschicht von PHP &amp; dem Maschinencode. Er kann von einer VM (ab PHP 5.5 Zend) gelesen werden, wodurch der Rechenaufwand deutlich sinkt. Sie ist eine einheitliche Laufzeitumgebung und abstrahiert verschiedene Betriebssysteme sowie CPU-Architekturen. Da der Bytecode im Arbeitsspeicher liegt, entfallen zudem I\/O Zugriffe. Schlie\u00dflich teilt sich Code oft auf zig PHP-Dateien auf, die zuvor vom Laufwerk geladen werden m\u00fcssen &#8211; ebenfalls bei jeder HTTP-Anfrage. <\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/vlcsnap-2026-03-03-21h51m13s616.avif\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"543\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/vlcsnap-2026-03-03-21h51m13s616-1024x543.avif\" alt=\"\" class=\"wp-image-16744\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/vlcsnap-2026-03-03-21h51m13s616-1024x543.avif 1024w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/vlcsnap-2026-03-03-21h51m13s616-300x159.avif 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/vlcsnap-2026-03-03-21h51m13s616-768x407.avif 768w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/vlcsnap-2026-03-03-21h51m13s616-640x339.avif 640w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/vlcsnap-2026-03-03-21h51m13s616-321x170.avif 321w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/vlcsnap-2026-03-03-21h51m13s616.avif 1509w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n<p>Ein OPcache lie\u00dft PHP-Skripte einmalig aus dem Dateisystem &amp; speichert sie als Bytecode in den RAM. Insbesondere bei komplexeren Anwendungen, die aus vielen Codezeilen sowie Dateien bestehen, kann es die Geschwindigkeit deutlich verbessern. Parallel sinkt die Serverlast. Wie stark dies ausf\u00e4llt, h\u00e4ngt vom konkreten Szenario ab. Da es sich hierbei um die interne Verarbeitung handelt, ist keine OPcache-Unterst\u00fctzung der Anwendung erforderlich.<\/p>\n<h2 class=\"wp-block-heading\">Wozu ein Variablen-Cache (bzw. User-Cache)?<\/h2>\n<p>Das HTTP-Protokoll ist zustandslos &#8211; bedeutet konkret: Jede Anfrage ist in sich geschlossen. Es werden keine Informationen aus Anfrage A in Anfrage B zur Verf\u00fcgung gestellt. Die einzige Ausnahme sind Cookies, welche vom Browser in zuk\u00fcnftigen Anfragen mitgesendet werden. Auch PHP ist standardm\u00e4\u00dfig Zustandslos: S\u00e4mtliche Variablen und sonstige Objekte entsorgt der Garbage Collector, nachdem die Anfrage abgeschlossen wurde.<\/p>\n<p>Wie man sich denken kann, ist das nicht ideal. Schlie\u00dflich sind viele Elemente einer Seite f\u00fcr alle oder einen Gro\u00dfteil der Besucher identisch. Ein konkretes Beispiel w\u00e4ren die Widget-Boxen rechts f\u00fcr die neuesten Inhalte. Es ist unn\u00f6tig, diese tausende male am Tag f\u00fcr jede Anfrage mit den gleichen Inhalten neu zu laden. Besonders kritisch wird es f\u00fcr die Performance, wenn diese eine aufw\u00e4ndige SQL-Abfrage erfordern. Oder sie ein API-Aufruf von einer externen Seite l\u00e4dt. Neben der Geschwindigkeit kommen dort au\u00dferdem Blockaden hinzu, falls die Zahl der Anfragen \u00fcberhand nimmt.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/http-abfrage_variablen-cache-gemeinsam-genutzt.avif\"><img loading=\"lazy\" decoding=\"async\" width=\"735\" height=\"1024\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/http-abfrage_variablen-cache-gemeinsam-genutzt-735x1024.avif\" alt=\"\" class=\"wp-image-16675\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/http-abfrage_variablen-cache-gemeinsam-genutzt-735x1024.avif 735w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/http-abfrage_variablen-cache-gemeinsam-genutzt-215x300.avif 215w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/http-abfrage_variablen-cache-gemeinsam-genutzt-768x1069.avif 768w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/http-abfrage_variablen-cache-gemeinsam-genutzt-259x360.avif 259w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/http-abfrage_variablen-cache-gemeinsam-genutzt-122x170.avif 122w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/02\/http-abfrage_variablen-cache-gemeinsam-genutzt.avif 851w\" sizes=\"auto, (max-width: 735px) 100vw, 735px\" \/><\/a><\/figure>\n<\/div>\n<p>Die L\u00f6sung liegt auf der Hand: Ein Speicher, der Variablen \u00fcber verschiedene Anfragen hinweg im RAM ablegt. Das ist der Variablen-Cache bzw. User-Cache. \u00dcber bestimmte PHP-Funktionen lassen sich Variablen in Anfrage A setzen, um sie in B &amp; C abzurufen.<\/p>\n<h2 class=\"wp-block-heading\">Prozessmanager wie PHP-FPM beschleunigen an anderer Stelle<\/h2>\n<p>An dieser Stelle sei auf ein weiteres gel\u00f6stes Problem hingewiesen: Am einfachsten l\u00e4sst sich PHP mit Apache2 und dem PHP-Modul (<em>mod_php<\/em>) nutzen. Man muss lediglich das Modul installieren &amp; aktivieren. Intern funktioniert es sehr simpel, in dem f\u00fcr jede HTTP-Verbindung ein PHP-Prozess gestartet wird (<em>mpm_prefork<\/em> Modus). Es werden also st\u00e4ndig neue, kurzlebige Prozesse gestartet. Je mehr Verbindungen, um so h\u00f6her sind RAM-Verbrauch &amp; CPU-Nutzung durch diese vielen Prozesse &#8211; das ist der erste Nachteil.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">$ apachectl -V | grep MPM\nServer MPM:     prefork<\/code><\/pre>\n<p>Durch die tiefe Integration in Apache h\u00e4ngt alles miteinander zusammen &amp; verursacht unn\u00f6tige Mehrlast: Jeder Apache-Prozess enth\u00e4lt den PHP-Interpreter sowie s\u00e4mtliche Apache-Module. Eine statische Anfrage beinhaltet Bestandteile von PHP, w\u00e4hrend PHP-Anfragen umgekehrt (irrelevante) Module des Webservers mit sich schleppen. Das ist ineffizient, aber nicht zwingend ein Problem. F\u00fcr weniger frequentiere Seiten kann es ausreichen.<\/p>\n<p>Besser geht es durch die Trennung von Webserver &amp; PHP: Prozessmanager wie PHP-FPM starten einen Pool aus PHP-Prozessen, die sich ausschlie\u00dflich darum k\u00fcmmern. Der Webserver leitet nur PHP-Anfragen dort hin weiter. Apache bietet <em>npm_worker_mdoule<\/em>, welches mehrere Threads pro Prozess startet. Allerdings ist PHP nicht threadsicher. PHP-FPM skaliert besser. Dies wird nur am Rande erw\u00e4hnt, weil nichts mit dem Caching zu tun hat. Sondern mit dem grunds\u00e4tzlichen Stack, davon sind die folgenden Optimierungen unabh\u00e4ngig: Sie k\u00f6nnen sowohl mit mod_php, als auch PHP-FPM verwendet werden.<\/p>\n<h2 class=\"wp-block-heading\">Ein Schwenk in die Geschichte der PHP-Beschleuniger: Warum es ist, wie es ist<\/h2>\n<p>Bislang habe ich nur die allgemeine Funktionsweise beschrieben. Da PHP dieses Thema lange vernachl\u00e4ssigte, schuf die Gemeinschaft verschiedene Quelloffene L\u00f6sungen. Einer der \u00e4ltesten ist APC: Der <em>Alternative PHP Cache<\/em> entstand in den fr\u00fchen 2000er Jahren, bis er 2012 eingestellt wurde. XCache schuf 2006 ein Lighttpd-Entwickler &#8211; ihn habe ich damals erstmals auf U-Labs eingesetzt. Beide bieten sowohl OPCache, als auch das Zwischenspeichern von Variablen. Dagegen konnte eAccelerator nur den PHP-Code im interpretierten Zustand speichern.<\/p>\n<p>Viele Projekte sahen sich als obsolet, als PHP mit Version 5.5 begann, die Zend OPcache Erweiterung auszuliefern.<sup data-fn=\"28b97496-3f66-4f0d-b31a-63465ee5a74b\" class=\"fn\"><a href=\"#28b97496-3f66-4f0d-b31a-63465ee5a74b\" id=\"28b97496-3f66-4f0d-b31a-63465ee5a74b-link\">2<\/a><\/sup> Urspr\u00fcnglich war APU im Gespr\u00e4ch, doch das PHP-Team entschied sich f\u00fcr Zend. Bewusst soll sie nur Bytecode zwischenspeichern, keine Objekte aus dem Nutzercode. Modularit\u00e4t, Stabilit\u00e4t &amp; geringe Komplexit\u00e4t wurden priorisiert. Dadurch fehlte weiterhin ein Objekt-Cache.<\/p>\n<p>Diese L\u00fccke wollte APC f\u00fcllen und erlangte als APCu die <em>Wiedergeburt.<\/em> APC selbst musste eingestellt werden: Da es OPcache &amp; Variablen-Cache enth\u00e4lt, war es nicht mehr mit PHP ab 5.5 kompatibel. Zumindest wenn Zend OPcache aktiviert wurde, kam es zum Konflikt. Zur L\u00f6sung entfernte APCu den OPcache. Somit r\u00fcstet man den fehlenden Zwischenspeicher f\u00fcr Variablen mittels APCu nach.<\/p>\n<h2 class=\"wp-block-heading\">Weiterentwicklung des Zend OPcache<\/h2>\n<p>PHP 5.5 erschien initial im Jahr 2013. In den ~13 Jahren wurde der OPcache \u00fcber verschiedene PHP-Versionen hinweg verbessert: In Version 7.0 wurde die Zend Engine in Version 3 komplett \u00fcberarbeitet. Man kann den Cache zus\u00e4tzlich im Dateisystem ablegen. Das beschleunigt die Neuverwendung nach dem Neustart, wodurch dieser bislang komplett neu aufgebaut werden musste. Oder falls der RAM-Cache ausgelastet ist. Generell brachte PHP 7.0 einige Performance-Verbesserungen gegen\u00fcber 5.x, man kann per Faustformel von etwa 50% ausgehen. Technisch wurde au\u00dferdem das Konzept des AST (<em>Abstract Syntax Tree<\/em>) eingef\u00fchrt, welches Parser &amp; Compiler aufteilt.<\/p>\n<p>Den ersten Start verbessert PHP 7.4 mit Preloading. In der <code class=\"\" data-line=\"\">php.ini<\/code> Direktive <code class=\"\" data-line=\"\">opcache.preload<\/code> kann der Pfad zu einer PHP-Datei angegeben werden, welche direkt beim Start geladen &amp; in den OPcache abgelegt werden soll. Zuvor bekam der erste Nutzer ein tendenziell schlechteres Erlebnis, vor allem beim Einsatz umfangreicher Frameworks.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/vlcsnap-2026-03-03-21h53m14s315-800px.avif\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"464\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/vlcsnap-2026-03-03-21h53m14s315-800px-1024x464.avif\" alt=\"\" class=\"wp-image-16746\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/vlcsnap-2026-03-03-21h53m14s315-800px-1024x464.avif 1024w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/vlcsnap-2026-03-03-21h53m14s315-800px-300x136.avif 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/vlcsnap-2026-03-03-21h53m14s315-800px-768x348.avif 768w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/vlcsnap-2026-03-03-21h53m14s315-800px-640x290.avif 640w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/vlcsnap-2026-03-03-21h53m14s315-800px-375x170.avif 375w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/vlcsnap-2026-03-03-21h53m14s315-800px.avif 1422w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n<h2 class=\"wp-block-heading\">Der JIT erweitert den OPcache<\/h2>\n<p>Ab PHP 8.0 kann JIT (<em>Just-In-Time Compilation<\/em>) zusammen mit OPcache sogar Maschinencode erzeugen.<sup data-fn=\"3fa07781-8dd1-4c1d-bb81-e2a1273c6103\" class=\"fn\"><a href=\"#3fa07781-8dd1-4c1d-bb81-e2a1273c6103\" id=\"3fa07781-8dd1-4c1d-bb81-e2a1273c6103-link\">3<\/a><\/sup> Bestimmte Codebereiche werden zur Laufzeit in Maschinencode statt Bytecode \u00fcbersetzt. Es existieren zwei Arten: &#8222;Function JIT&#8220; kompiliert Funktionen beim ersten Aufruf. Er ist stabiler, daf\u00fcr f\u00e4llt der Performance-Gewinn geringer aus. &#8222;Tracing JIT&#8220; dagegen analysiert, welche Codepfade zur Laufzeit h\u00e4ufig ausgef\u00fchrt werden &amp; kompiliert nur diese &#8211; das kann effizienter sein, in synthetischen Benchmarks 1,5x bis 2x besser. Die OPcache Erweiterung ist seit dem nicht mehr optional, d.H. PHP l\u00e4sst sich nur noch zusammen mit ihr kompilieren.<\/p>\n<p>Dieser Weg wurde in PHP 8.1 beibehalten: Verbesserungen am JIT machen die Technik stabiler. Auch der OPcache profitiert von Optimierungen.<sup data-fn=\"7c3fe19a-6a87-4cd4-8adb-fb2ff2075aea\" class=\"fn\"><a href=\"#7c3fe19a-6a87-4cd4-8adb-fb2ff2075aea\" id=\"7c3fe19a-6a87-4cd4-8adb-fb2ff2075aea-link\">4<\/a><\/sup> Wie stark, variiert je nach Anwendung. Bei einer Symfony-Demo ist 8.1 um 23% schneller, WordPress beschleunigt sich um 3,5%. Au\u00dferdem ist der JIT nun auch f\u00fcr ARM64 und damit langfristig auf Einplatinencomputern wie dem Raspberry Pi verf\u00fcgbar.<\/p>\n<h2 class=\"wp-block-heading\">Umfangreiche Nutzung: Beispiel WordPress<\/h2>\n<p>Der Effekt variiert abh\u00e4ngig von der Anwendung. Wer bereits bei der Entwicklung auf Effizient geachtet hat, wird mit Caching weniger heraus holen k\u00f6nnen. \u00c4hnlich wie beim Komprimieren von Dateien: Selbst vergleichsweise ineffiziente Algorithmen wie Zip k\u00f6nnen Text stark verkleinern. Bei bereits komprimierten Formaten wie JPG dagegen ist die Ersparnis sehr gering.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/wp-cache.avif\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"152\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/wp-cache-1024x152.avif\" alt=\"\" class=\"wp-image-17183\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/wp-cache-1024x152.avif 1024w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/wp-cache-300x45.avif 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/wp-cache-768x114.avif 768w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/wp-cache-640x95.avif 640w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/wp-cache.avif 1105w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n<p>Bei CMS ist sie meist hoch, weil Funktionsumfang &amp; Flexibilit\u00e4t h\u00e4ufig als wichtiger bewertet werden, als ein kleiner Fu\u00dfabdruck. Das verbreitetste ist WordPress. Eine produktive Installation die Plugins bewusst sparsam einsetzt, hat \u00fcber 730 PHP-Skripte im Zwischenspeicher liegen. Dort kann es einiges bewirken. Bereits wegen der umfangreichen Aufteilung auf viele verschiedene PHP-Dateien.<\/p>\n<h2 class=\"wp-block-heading\">APCu oder <em>Hype-Anwendungen<\/em> wie Redis\/Valkey\/Memcached?<\/h2>\n<p>Das Konzept von Schl\u00fcssel-Wert-Speichern im Arbeitsspeicher ist keineswegs neu, sondern ebenfalls gewachsen. Viele werden Redis als bekanntesten Vertreter kennen, gegr\u00fcndet bereits 2009. Valkey ist eine 2024 von der Open Source Initiative geschaffene Abspaltung als Reaktion auf Redis Wechsel von BSD zu einem dualen Lizenzmodell. Memcached ist noch \u00e4lter und erschien erstmals 2003. <\/p>\n<p>Die grunds\u00e4tzliche Funktion aller drei ist identisch, es gibt jedoch einen entscheidenden Unterschied: Redis, Valkey &amp; Memcached sind verteilte Caches. Man verbindet sich per TCP, wie zu einem Datenbankserver. So wird Skalierung erm\u00f6glicht, weil sich der Schl\u00fcssel-Wert-Cache auf einem eigenen Server befinden kann &#8211; oder gar einem ganzen Cluster. F\u00fcr sehr gro\u00dfe Seiten lohnt sich das &#8211; trotz der h\u00f6heren Latenz, die durch TCP-Verbindungen entsteht. Kleine bis mittelgro\u00dfe Webanwendungen profitieren mehr von APCu. Dort liegt alles auf dem gleichen Server, mehr Leistung\/Speicher ist ausschlie\u00dflich durch Aufr\u00fcsten m\u00f6glich.<sup data-fn=\"05d2a048-e098-4f54-85da-01d8e85aaa90\" class=\"fn\"><a href=\"#05d2a048-e098-4f54-85da-01d8e85aaa90\" id=\"05d2a048-e098-4f54-85da-01d8e85aaa90-link\">5<\/a><\/sup><\/p>\n<p>Oft wird Skalierung \u00fcbersch\u00e4tzt. Man ben\u00f6tigt sehr viele Besucher (oder sehr ineffizienten Code), um einen halbwegs solide ausgestatteten Server an seine Grenzen zu bringen. Wer dennoch diese Ambitionen hat, baut sich eine Caching-Klasse zur Abstrahierung. Das hat mir bereits anderweitig geholfen: Beim Wechsel des mittlerweile eingestellten Xcache zu APCu.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/webserver_lokal-vs-verteilter-cache_2.avif\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"697\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/webserver_lokal-vs-verteilter-cache_2-1024x697.avif\" alt=\"\" class=\"wp-image-16696\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/webserver_lokal-vs-verteilter-cache_2-1024x697.avif 1024w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/webserver_lokal-vs-verteilter-cache_2-300x204.avif 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/webserver_lokal-vs-verteilter-cache_2-768x523.avif 768w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/webserver_lokal-vs-verteilter-cache_2-529x360.avif 529w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/webserver_lokal-vs-verteilter-cache_2-250x170.avif 250w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2026\/03\/webserver_lokal-vs-verteilter-cache_2.avif 1204w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n<h2 class=\"wp-block-heading\">Diese versteckten Bremsen geh\u00f6ren nicht zu PHP<\/h2>\n<p>Der klassische Ansatz ohne jegliche Zwischenspeicher war keine Sternstunde hoher Performance. Das ist offensichtlich &#8211; schlie\u00dflich musste jede Anfrage zig PHP-Dateien laden und vom Interpreter ausf\u00fchren lassen. W\u00e4hrend dies seit langem gel\u00f6st ist, freut sich ein anderer Bremsklotz gro\u00dfer Beliebtheit: Frameworks.<\/p>\n<p>H\u00e4ufig werden sie nur zu einem Bruchteil ausgereizt und vergr\u00f6\u00dfern die Angriffsfl\u00e4che sowie den Wartungsaufwand. Caching kann ersteres nur abschw\u00e4chen, gegen den Rest ist es machtlos. Ich verzichte daher in aller Regel auf riesige Frameworks wie Symfony &amp; co. F\u00fcr sinnvolle Konstrukte wie z.B. MVC habe ich eigene minimalistische L\u00f6sungen entwickelt. Sie sind bereits ohne Caching pfeilschnell und gehen dabei sparsam mit Ressourcen um.<\/p>\n<p>Damit m\u00f6chte ich Frameworks nicht pauschal f\u00fcr jeden Anwendungsfall verteufeln. Sie k\u00f6nnen n\u00fctzlich sein &#8211; doch nur, wenn sie im Verh\u00e4ltnis zu den Anforderungen stehen. Hier scheitert es oft, etwa weil man sich mit Framework X auskennt. Daher kommt es zum Einsatz, obwohl eine schlankere L\u00f6sung ausreichen w\u00fcrde. Ebenfalls verbreitet ist Overengineering: Der Entwickler ist sich im klaren dar\u00fcber, ein viel zu umfangreiches Framework einzusetzen. Doch er rechnet damit, dass vielleicht sp\u00e4ter noch mehr dazu kommt, womit es sich rechnet. Weitsicht ist vern\u00fcnftig, doch sie muss Grenzen kennen. Oft kommt es nicht so weit. Daf\u00fcr hat man bis dahin eine ineffiziente Anwendung mit hohem Wartungsaufwand. Schlie\u00dflich erfordert das Framework regelm\u00e4\u00dfige Pflege &amp; Anpassungen am Code.<\/p>\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n<p>Es hat relativ lange gedauert, bis das PHP-Team mit Version 5.5 die Sinnhaftigkeit eines OPcache im Kern erkannt hat. Daf\u00fcr wurde es im Laufe der Versionen mit neuer Engine (PHP 7.0), dem Aufw\u00e4rmen (PHP 7.4) und ab PHP 8.0 dem JIT stetig verbessert. Ein Zwischenspeicher f\u00fcr Variablen fehlt zwar. Doch diese L\u00fccke f\u00fcllt APCu problemlos. Dies ist ein Gebiet, auf dem die Skriptsprache in den letzten Jahren deutlich aufgewertet wurde. Der Performance-Abstand zu dauerhaft laufenden Anwendungsservern (Gogs, NodeJS, .NET usw) schwindet weiter. Heute ist es leichter denn je, performante PHP-Webanwendungen zu entwickeln.<\/p>\n<p>Nicht \u00fcbersehen werden sollte: Der gr\u00f6\u00dfte Killer sind umfangreiche Frameworks. Man kann sie mit OPcache &amp; co. zwar weniger schlimm machen &#8211; doch niemals so performant, wie eine passende L\u00f6sung. Ganz zu schweigen vom h\u00f6heren Aufwand und der gesteigerten Angriffsfl\u00e4che. Statt zu versuchen, unn\u00f6tig umfangreiche Frameworks auf dieser Ebene weniger langsam zu machen, sollte man daher lieber von Anfang an pr\u00fcfen &amp; hinterfragen: Was brauche ich wirklich? Ist ein Framework daf\u00fcr tats\u00e4chlich notwendig, wenn ja welches? <\/p>\n<h2 class=\"wp-block-heading\">Quellen<\/h2>\n<ol class=\"wp-block-footnotes\">\n<li id=\"7252e6b3-b0f4-4b1c-b1ac-88dd88e8730b\"><a href=\"https:\/\/w3techs.com\/technologies\/overview\/programming_language\" target=\"_blank\" rel=\"nofollow\">https:\/\/w3techs.com\/technologies\/overview\/programming_language<\/a> <a href=\"#7252e6b3-b0f4-4b1c-b1ac-88dd88e8730b-link\" aria-label=\"Zur Fu\u00dfnotenreferenz 1 navigieren\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"28b97496-3f66-4f0d-b31a-63465ee5a74b\"><a href=\"https:\/\/www.php.net\/releases\/5_5_0.php\" target=\"_blank\" rel=\"nofollow\">https:\/\/www.php.net\/releases\/5_5_0.php<\/a> <a href=\"#28b97496-3f66-4f0d-b31a-63465ee5a74b-link\" aria-label=\"Zur Fu\u00dfnotenreferenz 2 navigieren\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"3fa07781-8dd1-4c1d-bb81-e2a1273c6103\"><a href=\"https:\/\/www.php.net\/releases\/8.0\/en.php\" target=\"_blank\" rel=\"nofollow\">https:\/\/www.php.net\/releases\/8.0\/en.php<\/a> <a href=\"#3fa07781-8dd1-4c1d-bb81-e2a1273c6103-link\" aria-label=\"Zur Fu\u00dfnotenreferenz 3 navigieren\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"7c3fe19a-6a87-4cd4-8adb-fb2ff2075aea\"><a href=\"https:\/\/www.php.net\/releases\/8.1\/en.php\" target=\"_blank\" rel=\"nofollow\">https:\/\/www.php.net\/releases\/8.1\/en.php<\/a> <a href=\"#7c3fe19a-6a87-4cd4-8adb-fb2ff2075aea-link\" aria-label=\"Zur Fu\u00dfnotenreferenz 4 navigieren\">\u21a9\ufe0e<\/a><\/li>\n<li id=\"05d2a048-e098-4f54-85da-01d8e85aaa90\"><a href=\"https:\/\/reintech.io\/blog\/guide-php-apcu-library-caching-performance-optimization\" target=\"_blank\" rel=\"nofollow\">https:\/\/reintech.io\/blog\/guide-php-apcu-library-caching-performance-optimization<\/a> <a href=\"#05d2a048-e098-4f54-85da-01d8e85aaa90-link\" aria-label=\"Zur Fu\u00dfnotenreferenz 5 navigieren\">\u21a9\ufe0e<\/a><\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Die Leistung von PHP-Anwendungen l\u00e4sst sich deutlich verbessern. Das reduziert Ladezeiten &amp; Serverlast. W\u00e4hrend der OPcache jedes PHP-Projekt ohne Anpassungen beschleunigt, wird der Zwischenspeicher f\u00fcr Variablen in den Code integriert. Dieser Artikel stellt beide Varianten sowie den neuen JIT-Compiler vor und fasst ihre Umbr\u00fcche aus der historische Entwicklung zusammen. Er soll als Einstieg dienen, um &#8230;<\/p>\n","protected":false},"author":5,"featured_media":16680,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":"[{\"content\":\"<a href=\\\"https:\/\/w3techs.com\/technologies\/overview\/programming_language\\\">https:\/\/w3techs.com\/technologies\/overview\/programming_language<\/a>\",\"id\":\"7252e6b3-b0f4-4b1c-b1ac-88dd88e8730b\"},{\"content\":\"<a href=\\\"https:\/\/www.php.net\/releases\/5_5_0.php\\\">https:\/\/www.php.net\/releases\/5_5_0.php<\/a>\",\"id\":\"28b97496-3f66-4f0d-b31a-63465ee5a74b\"},{\"content\":\"<a href=\\\"https:\/\/www.php.net\/releases\/8.0\/en.php\\\">https:\/\/www.php.net\/releases\/8.0\/en.php<\/a>\",\"id\":\"3fa07781-8dd1-4c1d-bb81-e2a1273c6103\"},{\"content\":\"<a href=\\\"https:\/\/www.php.net\/releases\/8.1\/en.php\\\">https:\/\/www.php.net\/releases\/8.1\/en.php<\/a>\",\"id\":\"7c3fe19a-6a87-4cd4-8adb-fb2ff2075aea\"},{\"content\":\"<a href=\\\"https:\/\/reintech.io\/blog\/guide-php-apcu-library-caching-performance-optimization\\\">https:\/\/reintech.io\/blog\/guide-php-apcu-library-caching-performance-optimization<\/a>\",\"id\":\"05d2a048-e098-4f54-85da-01d8e85aaa90\"}]"},"categories":[61],"tags":[55],"class_list":["post-16470","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-softwareentwicklung","tag-php"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/16470","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=16470"}],"version-history":[{"count":100,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/16470\/revisions"}],"predecessor-version":[{"id":17184,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/16470\/revisions\/17184"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/16680"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=16470"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=16470"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=16470"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}