OpCache in PHP 5.5
Ende Januar wurde es von Zeev Suraski, dem Chef von Zend, angekündigt und am 13. Februar in die Tat umgesetzt: Der Quellcode des Opcode Caches von Zend mit dem Namen Optimizer Plus wurde auf GitHub veröffentlicht und unter die PHP-Lizenz gestellt, mit dem Ziel es in den PHP-Kern einzubauen. Der Zeitplan war aber sehr problematisch, denn eigentlich war für März die neue PHP-Version 5.5 geplant. Doch der Code ist bereits seit Jahren im Closed-Source-Einsatz bei Zend, ziemlich stabil, und es wäre das neue Feature in der neuen Version.
Release und Voting
Doch dafür muss der jährliche Release-Zyklus gedehnt und das Release um wenige Monate verschoben werden. Die Diskussion ging einige Wochen, auch bereits vor der eigentlichen Veröffentlichung, und ein Voting im RFC sollte entscheiden. Doch auch das Voting war problematisch, denn es gab 3 Möglichkeiten: Release mit PHP 5.5 incl. Verzögerung von wenigen Monaten, Release mit PHP 5.5 nur ohne Verspätung sprich 5.6, und die dritte Möglichkeit war keine Integration in den Kern.
Das Ergebnis war 44 zu 22 zu 4. Doch dann kamen weitere Diskussionen ob nun 66% oder 50% Mehrheit gebraucht wurde, denn 66% sind nötig bei gravierenden Änderungen an der Sprache. Gott-sei-Dank wurde die Diskussion beendet und die Integration gestartet. Wichtige Projekte und Frameworks wurden getestet, Performance–Tests durchgeführt, die Codebasis studiert und sich eingearbeitet damit man später auch Bugs beheben kann.
Aktuell sind wir nun in der Situation dass es endlich ein PECL-Release des Optimizer Plus gibt, für Windows gibt es .dlls, und es kann ab PHP 5.2 genutzt werden. Der offizielle Name heißt „Opcache“, die php.ini Einstellungen beginnen alle mit opcache. , und der Quelltext wurde in das PHP-Repository gemergt.
Was ist mit APC?
Warum wird nun der Optimizer Plus integriert und nicht APC? APC ist sehr beliebt, aber problematisch weil recht kompliziert. Nach dem Release von PHP 5.4 hat es ein halbes Jahr gebraucht bis APC einsatzfähig war, was die Verbreitung von 5.4 sehr gedämpft hat. Der Code von APC ist sehr umfangreich und nur sehr wenige Entwickler können ihn überblicken und darin Fehler finden und beheben.
Der Optimizer Plus enthält im Gegensatz zu APC keinen User Cache, sprich apc_store(), apc_fetch() usw. Wer ab PHP 5.5 dieses Feature benötigt wird wahrscheinlich auf APCu zurückgreifen werden, denn das ist der herausgetrennte User Cache von APC. Der Optimizer Plus ist lauffähig ab PHP 5.2 und auch bereits sehr stabil für die neue PHP-Version 5.5, APC läuft da hinterher.
Ähnlich wie für APC wird es auch eine Opcache Status Seite geben, auf der man die wichtigsten Details sehen kann, beispielsweise wie viele Dateien gecacht sind, wie das Hit-Miss-Verhältnis ist, die aktuelle Konfiguration usw. Ein Beispiel der Opcache-Status-Seite für php.net hat Rasmus Lerdorf bereitgestellt, denn dort läuft der OpCache bereits.
Alles neu mit 5.5
In wenigen Tagen dürfen wir die erste Beta-Version von PHP 5.5 erwarten, und wenige Wochen danach sollte es dann in einer stabilen Version erscheinen. Neben dem eingebauten Opcache gibt es dann neue Features wie Generatoren, finally, foreach kombiniert mit list(), empty() wird Ausdrücke erlauben, Passwort-Hashing-Funktionen können genutzt werden, und ext/mysql wird endlich deprecated. Also hopp-hopp, alles was mit mysql_* anfängt gehört in die Tonne und stattdessen mysqli_ oder PDO genutzt. Nebenbei wird die neue Version wieder einige Prozent an Performance zulegen, sodass es keinen Grund geben wird nicht zeitig upzugraden. Und nebenbei bemerkt wird PHP 5.3 dann nur noch mit Sicherheitsfixes versorgt werden für ein Jahr, 5.3 wurde im Juni 2009 released, es ist also Zeit für eine neue Version.
Testen, Testen, Testen!
Zum Abschluss gehen wir noch mal schnell durch wie ihr innerhalb von 5 Minuten helfen könnt die neue Version zu testen:
Pfad zur neuesten Version von PHP suchen: http://qa.php.net/ wget http://snaps.php.net/php5.5-201303182230.tar.gz tar -xzvf php5.5-201303182230.tar.gz cd php5.5-201303182230 ./configure --prefix=/usr/local/php5.5-201303182230 --with-zlib --with-config-file-path=/usr/local/php5.5-201303182230/etc --enable-mbstring --enable-zip --with-imap --with-kerberos --with-imap-ssl --with-openssl --with-jpeg-dir --with-gd --with-gettext --with-freetype-dir make // Nun 5 Minuten warten make test sapi/cli/php -d "zend_extension=/home/michael/php5.5-201303182230/modules/opcache.so" -v PHP 5.5.0-dev (cli) (built: Mar 19 2013 01:09:26) Copyright (c) 1997-2013 The PHP Group Zend Engine v2.5.0-dev, Copyright (c) 1998-2013 Zend Technologies with Zend Optimizer+ v7.0.1-dev, Copyright (c) 1999-2013, by Zend Technologies cd .. rm -Rf php5.5-201303182230*
Im Idealfall macht ihr nach dem make test noch ein make install und probiert es mit euren Applikationen aus, gucken ob noch alles funktioniert, und wenn ihr die PHP-Rocker schlechthin sein wollt: Benchmarks gegen die alte(aktuelle) Version!
> Gott-sei-Dank wurde die Diskussion beendet und die Integration gestartet.
Sicherlich „Gott-sei-Dank“, bloß wie? für mich bestärkt sich zunehmend der Eindruck, dass manche Entscheidungen eher pro-forma abgestimmt werden, weil das vorher bestimmte Ziel dann eh rein interpretiert wird, insofern finde ich die gesamte Kritik am Voting- und Release-Prozess/-RFC vollkommen berechtigt.
Hinzu kommt, dass sich niemand einen Zacken aus der Krone gebrochen hätte, wenn opcache zumindest für eine Version nur als PECl verfügbar gewesen wäre, schließlich leben wir so mit APC schon seit ewig. Wieso also nun gleich mehrere (zwei ;)) eigentlich schon lange akzeptierte RFCs so lange umbiegen, bis man es dann doch irgendwie ins Release quetschen kann?
KingCrunch
20 Mrz 13 at 11:51
Danke für den Artikel. Momentan habe ich eaccelerator im Einsatz, bei dem das aktuelle Release aber auch nicht mit PHP 5.4 umgehen kann. Ich denke ich werde die nächsten Tagen die PECL-Erweiterung austesten. Mit dem Optimizer ist man erstmal auf der sicheren Seite, was die Versionsunterstützung angeht.
Thorsten Richter
20 Mrz 13 at 12:21
Ich denke, dass es auch erwähnenswert ist, was Xinchen Hui – alias Laurence – entwickelt hat:
http://www.laruence.com/2013/03/18/2846.html
Dieser User Cache soll (laut seinen Benchmarks) um einiges schneller als APC sein, baut aber auf der Annahme auf, dass ein Cache weit öfter gelesen als geschrieben wird (was auch der Fall sein sollte ;)).
Nur so FYI .. wenn jemand mit APC generell nicht zufrieden ist und (wenn schon der OpCache nicht mehr von APC kontrolliert ist) auch für den User Cache nach anderen Möglichkeiten Ausschau hält.
Simon Schick
21 Mrz 13 at 11:54
@Simon: Danke für den Link. Yac kann ich eigentlich nur empfehlen. In einzelnen Benchmarks ist es zwar minimal langsamer, allerdings sobald es unter Last geht, ist es wesentlich schneller.
Zend Optimizer kann zumindest in meinen Tests nicht mit APC mithalten. WordPress ist etwas 10 % langsamer, Yii ist 3 mal so langsam. Ich habe es mal testweise an und direkt wieder ausgemacht. Testsystem ist PHP 5.3.20.
Oliver
24 Mrz 13 at 16:17