Wenn die Skripte auf dem eigenen Webserver träge werden, liegt das nicht immer an schlecht geschriebenem Code. Als Alternative zu mehr oder schnelleren CPUs bieten sich PHP-Beschleuniger an, die dem Apache mit Code-Optimierung und intelligentem Caching zur Seite stehen.
PHP ist die Nummer eins unter den Web-Skriptsprachen. Da ist es nur natürlich, dass Firmen und Privatprogrammierer sogar hochkomplexe Anwendungen damit realisieren. Oft fangen sich die Inter- oder Intranetbetreiber mit den interpretativ abzuarbeitenden Skripten massive Performanceprobleme ein. Als Alternative zu einem Hardware-Ausbau analysiert der folgende Test den Geschwindigkeitsgewinn und die Features von vier PHP-Softwarebeschleunigern.
In einem Standard-LAMP-System läuft die PHP-Verarbeitung so: Sobald der Apache auf PHP-Code trifft, übernimmt sein PHP-Modul Mod_php die Regie und übersetzt die Quelle in einen abstrakten Byte-Zwischencode. Die virtuelle Maschine von Mod_php interpretiert den Code und kommuniziert die Ein- und Ausgaben an den Apache zurück.
Die vorgestellten Beschleuniger sind ausnahmslos PHP-Erweiterungen, laufen also im selben Prozesskontext und damit mit den gleichen Rechten wie der Webserver, genauer: wie dessen PHP-Interpreter. Neben Apache 1.3 und 2.0 (Prefork-MPM) mit Mod_php unterstützen die Produkte alle Fast-CGI-konformen[1] Server, etwa Lighttpd und Zeus.
Drei Strategien
Prinzipiell sind drei Beschleunigungsstrategien bekannt, die die vorgestellten vier Produkte mehr oder minder intensiv betreiben und kombinieren:
- Zunächst versuchen alle vier die Qualität des
erzeugten Bytecode zu analysieren und auf Geschwindigkeit zu
optimieren. Die dynamische Natur von PHP scheint diese
Bemühungen allerdings auf einfache Peephole-Optimierungen zu
beschränken: Der Optimierer betrachtet nur einige wenige
Instruktionen auf einmal und versucht bestimmte Bytecode-Sequenzen
durch schnellere zu ersetzen, beispielsweise »$i++;«
durch »++$i;«. - Zum anderen betreibt jeder Beschleuniger als Shared Memory
einen gemeinsamen Bytecode-Cache, der den übersetzten Bytecode
aller Kindinstanzen des Webservers sehr viel länger
zwischenspeichert, als es der Betriebsablauf eigentlich erfordern
würde. PHP orientiert sich nämlich stark am
Request-Response-Modell von HTTP: Darum erstreckt sich die
Lebensdauer eines PHP-Skripts – und damit seines Bytecode –
normalerweise nur über den Zeitraum zwischen Aufruf im Browser
und der Ausführung der letzten Skriptzeile. Das bedeutet, dass
Mod_php ohne Bytecode-Cache-Unterstützung ein Skript bei jedem
Aufruf neu einlesen und übersetzen muss. - Einige Beschleuniger stellen den PHP-Entwicklern ein API zur
Verfügung, über das sie in ihren Skripten beliebige
Daten, beispielsweise komplexe Ausgaben,
Performance-förderlich im Shared Memory vorhalten
dürfen.
Zend Performance Suite
Die Zend Performance Suite ist neuerdings Teil der Zend Platform[2]. Zu den Gründern der Firma zählen die PHP-Architekten Andi Gutmans und Zeev Zuraski. Daher verwundert es nicht, dass sich Zend selbstbewusst “The PHP Company” nennt. Vorbildlich: Als einziges Produkt im Testfeld installiert sich die Performance Suite über ein Skript. Es fragt die Pfade von Apache und PHP sowie den Ort der Lizenzdatei ab.
Etwas Beachtung erfordert die mitgelieferte Version des Optimizer. Die anfänglich getestete war nicht mit PHP 4.3.10 kompatibel. Das Installieren des neuesten Optimizer[3] löste das Problem. Neben Bytecode-Caching und einem guten Optimierer speichert die Suite auch die Ausgaben von dafür geeigneten Skripten zwischen und komprimiert sie.
Alle diesbezüglichen Einstellungen lassen sich in einer Web-basierten Konsole vornehmen (siehe Abbildung 1) und mit dem integrierten Benchmark vergleichen. Der Entwickler kann Zwischenergebnisse oder Teilausgaben durch spezielle Anweisungen zwischenspeichern lassen (Partial Page Caching). Das Benutzerhandbuch[4] enthält (nicht nur) hierfür Informationen und Beispiele.

Abbildung 1: In der Weboberfläche der Zend Performance Suite nimmt der Entwickler bequem Performance-Optimierungen vor.

Abbildung 2: Turck MM Cache hat wie die Zend-Suite ein Administrationsfrontend – es bietet aber merklich weniger Möglichkeiten.
Zum Lieferumfang gehört auch der Zend Download Server, der die Serverbelastung beim Laden großer Dateien reduziert. Die Zend-Suite ist mit 995 US-Dollar pro Jahr für eine CPU das einzige kostenpflichtige Produkt im Test. Beim Registrieren hält die Homepage[2] eine kostenlose Evaluationsversion bereit.
Ioncube PHP Accelerator
Das zweite Closed-Source-Produkt im Test ist der PHP Accelerator der englischen Firma Ioncube, den es kostenlos unter[5] gibt. Funktional bietet der PHP-A einen Bytecode-Optimierer und einen Bytecode-Cache. Letzteren legt Ioncube parallel im Shared Memory und auf der Platte ab, weshalb nach jedem Apache-Neustart sofort gültiger Code im Cache vorhanden ist.
Obwohl die Homepage seit Anfang 2004 nicht mehr aktualisiert wurde, funktioniert die Installation genau so, wie es das »INSTALL«-Dokument beschreibt. Auch im Betrieb mit der aktuellen PHP-4-Version traten keine Probleme auf. Für Supportanfragen steht neben dem Hersteller selbst auch ein aktives Forum[6] zur Verfügung. Nach Angaben des Entwicklers Nick Lindridge ist ein PHP-5-geeigneter PHP Accelerator nicht geplant; ein neuer, nicht auf PHP-A basierender Beschleuniger für PHP 5 sei allerdings in der Konzeption.
|
Tabelle 1: |
||||
|---|---|---|---|---|
|
|
Performance Suite |
PHP Accelerator |
MM Cache |
Alternative PHP Cache |
|
Hersteller |
Zend |
Ioncube |
Turck Software |
PEAR-Projekt |
|
Preis |
ab 995 Dollar/Jahr |
kostenlos |
kostenlos |
kostenlos |
|
Distribution |
Binär (Glibc 2.1/2.2) |
Binär (Glibc 2.1) |
Quellen |
Quellen |
|
PHP ab Version |
4.1 |
4.0.6 |
4.1 |
4.2.2 |
|
PHP 5 |
ja |
nein |
nein |
in Planung |
Turck MM Cache
MM Cache ist ein freier PHP-Beschleuniger. Auf der von Sourceforge gehosteten Homepage[7] finden sich detaillierte Installationsanweisungen und weiter gehende Informationen über den Funktionsumfang des Produkts. Es ist über eine rudimentäre Weboberfläche konfigurierbar, die allerdings nicht mit der von Zend mithalten kann.
Wie die Zend Performance Suite bietet auch MM Cache dem Entwickler PHP-Funktionen an, um Werte über mehrere Skriptaufrufe hinweg zu speichern. Auf der Homepage findet sich eine ausführliche Beschreibung des API. Da der Hauptentwickler von Turck MM Cache, Dimitry Stogov, mittlerweile für Zend arbeitet, ist die Zukunft des Projekts recht ungewiss. Die freie Verfügbarkeit des Quelltextes ermöglichte aber die Arbeit an E-Accelerator[8]. Das noch junge Projekt will MM Cache weiterentwickeln und wartet bereits heute mit PHP-5-Unterstützung auf.
Alternative PHP Cache
Der Beschleuniger APC[9] ist eine Open-Source-Software, die der Autor von “Advanced PHP Programming”, George Schlossnagle, und Daniel Cowgill als Teil des PHP Extension and Application Repository (PEAR) entwickeln. APC legt die gecachten Skripte wahlweise in Shared Memory oder im Dateisystem ab. Letztere Option nutzt aus Performancegründen Mmap, um die Bytecode-Dateien im Speicher abzubilden.
Den vorhandenen Bytecode-Optimizer von APC klassifizieren die beiden Entwickler als “experimental”. Die mitgelieferte »INSTALL«-Datei beschreibt detailliert die Installationsschritte. Wer mehrere PHP-Installationen gleichzeitig nutzt, sollte das Paket jedoch wie in Listing 1 beschrieben konfigurieren.
Leider stürzte APC im Test bei mehreren Benchmarks regelmäßig ab (siehe unten). Die Praxistauglichkeit des Beschleunigers ist daher fraglich – zumindest gilt für APC in erhöhtem Maße das, was für alle PHP-Beschleuniger eigentlich Usus ist: Vor dem Einsatz in einer Produktionsumgebung stehen gründliche Tests mit echten Daten.
|
Listing 1: |
|---|
01 # Der /usr-Pfad ist durch den zu ersetzen, 02 # in dem die PHP-Installation zu finden ist: 03 04 export PHP_PREFIX="/usr" 05 $PHP_PREFIX/bin/phpize 06 ./configure --enable-apc --with-php-config=$PHP_PREFIX/ bin/php-config 07 make 08 09 # Jetzt wie in INSTALL beschrieben fortfahren |

Abbildung 3: Geschwindigkeit der vier getesteten Beschleuniger im Vergleich zu unbeschleunigtem PHP. Gute Werte bei mehreren konkurrierenden Zugriffen bedeuten, dass das Produkt gut skaliert. APC stürzte bei den Vivego-Benchmarks stets ab.
Testszenario
Alle Testkandidaten mussten auf einem Gentoo-System mit Apache 1.3.33 und PHP 4.3.10 ihr Können beweisen. Diese vier Skripte lagen dazu bereit:
- Bench.php[10] ist ein synthetischer PHP-Benchmark, der die
Geschwindigkeit von Funktionsaufrufen, Schleifen, Arrays et cetera
misst.
n PHP MyAdmin ist ein in prozeduralem PHP verfasstes MySQL-Frontend. Die Messung rief die Startseite ab, die primär Zeichenketten und Arrays verarbeitet und »if«-Konstruktionen enthält.
- Der Vivego-Unit-Test und schließlich
- die Startseite der Vivego-Administration. Vivego ist ein
kommerzielles Framework in einer pragmatischen Mischung aus
objektorientiertem und funktionalem PHP-Stil, das der Autor dieses
Artikels entwickelt hat.
Zum Messen rief der Benchmark »ab«, er ist Teil des Apache-Pakets, das jeweilige Skript 100-mal ab. Der »ab« ist ein CLI-Programm, das eine per »-n Anzahl« vorgegebene Menge HTTP-Requests an die ihm übergebene URL abfeuert[11]. Zudem variierten die gleichzeitigen Anfragen zwischen eins und zehn (mit der »ab«-Option »-c Anzahl«), um das Verhalten unter Last konkurrierender Zugriffe zu testen. Um faire Bedingungen zu garantieren, bekamen die Produkte ihre Caches vor den Messungen mit Hilfe einiger Probeläufe initialisiert.
Benchmark-Ergebnisse
Die Ergebnisse in Abbildung 3 sind keine absoluten Zeiten, sondern Faktoren der erreichten Beschleunigung im Verhältnis zu nativer PHP-Verarbeitung. Offensichtlich bewegen sich alle Produkte in einem Geschwindigkeitsbereich. Die Ergebnisse der Zend-Suite beim synthetischen Benchmark liegen – vor allem auf Grund besserer Performance von Funktionsaufrufen und Schleifen – deutlich über denen der Konkurrenz.
Nur kann das Produkt diesen Vorsprung nicht auf praktische Applikationen übertragen. Es ist, gemeinsam mit dem Ioncube PHP Accelerator, meist im Mittelfeld anzutreffen. APC zeigt zwar bei PHP MyAdmin brauchbare Ergebnisse, beschleunigt den synthetischen Benchmark aber überhaupt nicht und stürzt im Vivego-Framework bei fast jedem Request ab. Anders Turck: MM Cache liefert bei Einzelzugriffen und mehr noch unter Last exzellente Werte ab und verlässt das Rennen als Sieger.
Die Ergebnisse sind aber nicht auf jeden Einzelfall eins zu eins übertragbar, da Systemkonfiguration, Besucherzahlen und die Struktur der zu beschleunigenden Skripte Einfluss nehmen. Es ist also sinnvoll, sich auf dem eigenen Server und mit der Software vor Ort ein eigenes Bild zu machen. Zu berücksichtigen sind auch Support, Integrationsmöglichkeiten und die Eignung für PHP 5. jk
|
Infos |
|---|
|
[1] Fast-CGI: [http://fastcgi.com] [2] Zend Platform: [http://zend.com/store/products/zend-platform/] [3] Zend Optimizer: [http://www.zend.com/store/products/zend-optimizer.php] [4] Benutzerhandbuch der Zend Performance Suite: [http://www.zend.com/support/user_docs/PerformanceSuite/ZendPerformanceSuite_UserGuide.pdf] [5] Ioncube PHP Accelerator: [http://php-accelerator.co.uk] [6] Supportforum für PHP-A: [http://phpa.phorum.org/list.php?f=2] [7] Turck MM Cache: [http://turck-mmcache.sourceforge.net] [8] E-Accelerator: [http://eaccelerator.net] [9] APC: [http://pecl.php.net/package/APC] [10] Bench.php: [http://cvs.php.net/ZendEngine2/bench.php] [11] Manpage des Apache-Benchmark: [http://www.cs.umbc.edu/cgi-bin/man-cgi?ab] |
|
Der Autor |
|---|
|
Michael Walter ist Grafikprogrammierer bei Ubisoft im kanadischen Montreal. Er arbeitet seit fünf Jahren in der professionellen Webentwicklung und hält sich auch in seiner Freizeit mit Neuigkeiten in diesem Gebiet fit. |






