An den richtigen Stellen schrauben

Teil 2: PHP-Optimierung

  1. PHP-Optimierung
  2. Teil 2: PHP-Optimierung
  3. Teil 3: PHP-Optimierung
<?php
// Einbinden der Klasse und Setzen
der Optionen
require_once ('Cache.php');
$opts = array(
'cache_dir' => 'cache'
);
// Erstellung der Cache-Klasse
$cache = new Cache('file', $opts);
$cache->fileLocking(true);
$id = $cache->generateID(
$_SERVER['PHP_SELF']);
if (!$content = $cache->get($id)) {
// Inhalt nicht im Cache
$content = 'Beliebiger Text der
gecacht wird';
$cache->save($id, $content, 10);
}
echo $content;
?>

Einige Punkte des Listings sind besonders interessant und verdienen eine genauere Betrachtung. Wird die Klasse, wie auf der Homepage beschrieben, über den Pear- Installer eingerichtet, so ist die Verwendung denkbar einfach. Per require-Befehl wird die Klasse eingebunden und anschließend instanziert. Dabei können zusätzliche Parameter mit übergeben werden, die das Verhalten der Klasse beeinflussen.

In unserem Beispiel der Verzeichnisname für die Cache-Dateien. In der API-Dokumentation der Klasse sind alle möglichen Einstellungen aufgeführt. Neben den Optionen wird dem Konstruktor die Art der Speicherung mitgegeben. Im gezeigten Beispiel werden die Cache-Dateien in Dateien abgelegt.

Durch den Aufruf der Funktion fileLocking, wird die Cache-Datei für andere Zugriffe gesperrt. So wird sichergestellt, dass nicht zwei Scripte gleichzeitig schreibend auf die Cache-Datei zugreifen können. Die Erzeugung einer eindeutigen ID ist notwendig, um für die Caching-Klassen die Zuordnung zwischen einer Cache-Datei und dem jeweiligen Skript treffen zu können.

Nun folgen die entscheidenden Zeilen für die eigentliche Cache-Funktionalität. Der Aufruf der get-Funktion prüft, ob für die Seite gecachte Daten vorliegen oder nicht. Das Speichern von Daten geschieht durch den Aufruf der save-Funktion. Hier wird auch durch einen Übergabeparameter festgelegt, wie lange die im Cache ausgelagerten Daten verfügbar sein sollen. Nach Ablauf dieser Zeit verfällt die Cache-Datei automatisch. Im gezeigten Beispiel werden die Daten nach 10 Sekunden automatisch wieder gelöscht.

Im bisher gezeigten Beispiel wurde nur ein einzelner String in einer Cache-Datei gespeichert. Möchte man eine ganze Webseite in einem Cache ablegen, gibt es eine Helfer-Klasse, die genau dies ermöglicht. Das folgende Listing zeigt ein Beispiel für die Verwendung dieser Klasse.

<?php
// Einbinden der Klasse und Setzen
der Optionen
require_once ('Cache/Output.php');
$opts = array(
'cache_dir' => 'cache'
);
// Erstellung der Cache-Klasse
$cache = new Cache_Output('file',
$opts);
$cache->fileLocking(true);
$id = $cache->generateID(
$_SERVER['PHP_SELF']);
if (!$content = $cache->start($id)) {
// Inhalt nicht im Cache
echo 'Beliebiger Text der gecacht
wird';
$cache->endPrint(10);
}
else {
echo $content;
exit();
}
echo $content;
?>

Der Unterschied zum vorangegangenen Beispiel ist nicht besonders groß, statt der Funktionen get und save kommen nun start und endPrint zum Einsatz. Alles, was zwischen diesen beiden Funktionsaufrufen ausgegeben wird, landet automatisch in der Cache-Datei. Dadurch lassen sich komplette Internetseiten in Cache-Dateien zwischenspeichern.

Für besonders große Anwendungen, die über mehrere Server hinweg verteilt sind, ist ein verteiltes Caching-System wie Memcached ideal und bringt große Geschwindigkeitsvorteile.

Bytecode Caching

PHP-Anwendungen werden immer größer und komplexer. Gerade im Zeitalter von objektorientierter Programmierung wächst die Anzahl der Dateien und des Quellcodes immer mehr an. Da PHP eine interpretierende Sprache ist, werden die Dateien eines Skriptes bei jedem Request erneut geladen und in einen Zwischencode umgewandelt, der anschließend vom PHP-Interpreter ausgeführt wird.

Abbildung 1 zeigt die Schritte dieses Vorgangs. Während der Entwicklungsphase einer Anwendung ist dieses Verhalten von PHP von Vorteil. Im Gegensatz zu vielen anderen Sprachen und Technologien im Webbereich ist kein umständliches Kompilieren und Verteilen der Anwendung notwendig. Änderungen an PHP-Skripten wirken sich direkt beim nächsten Aufruf der Seite aus.

PHP-Performance-Optimierung

© Archiv

Abbildung 1: Standardmäßig übersetzt PHP den Quellcode bei jedem Aufruf in einen interpretierbaren Zwischencode.

Was in der Entwicklungsphase von Vorteil ist, wirkt sich allerdings bei produktiv eingesetzten Anwendungen nachteilig aus. Die Skripte müssen bei jedem Aufruf von Neuem in Zwischencode übersetzt werden, obwohl keine Änderungen daran vorgenommen wurden. Dieser Vorgang kostet Zeit und verringert damit die Leistungsfähigkeit der Anwendung. Je größer und komplexer das PHP-Skript ist, desto länger ist zudem die notwendige Zeit, um den Zwischencode zu erzeugen.

Da PHP-Anwendungen seit Jahren immer komplexer werden, existieren verschiedenste Erweiterungen, die diesem Problem zu Leibe rücken. Das Grundprinzip ist überwiegend dasselbe. Die Umwandlung der PHP-Skripte in kompilierten Opcode wird nur einmal durchgeführt. Der bei dieser Kompilierung entstehende Opcode wird zwischengespeichert und beim nächsten Aufruf des Skriptes wiederverwendet.

Dadurch entfällt die Notwendigkeit, das Skript bei jedem Aufruf neu übersetzen zu müssen. Abbildung 2 zeigt dieses Vorgehen in grafischer Form. Bei PHP-Anwendungen, die aus vielen großen Dateien bestehen, bringt dies einen beachtlichen Geschwindigkeitsvorteil.

PHP-Performance-Optimierung

© Archiv

Abbildung 2: Durch Opcode-Caching wird der PHP-Quellcode nur noch nach erfolgten Änderungen neu übersetzt.

Zusätzlich zur Ablage der kompilierten PHP-Dateien, können diese kompilierten Opcode-Dateien auch noch auf Geschwindigkeit hin optimiert werden, indem nicht benötigter Quellcode entfernt wird oder langsame Sprachkonstrukte durch schnellere Verfahren ersetzt werden. Da für eine solche Optimierung ebenfalls Zeit benötigt wird, macht sie nur in Zusammenhang mit dem Opcode-Caching Sinn.

Als PHP-Entwickler haben Sie hier die Qual der Wahl. Es existieren verschiedene Lösungen, die je nach Anwendungsfall auch unterschiedlich leistungsfähig sind. Die folgende Liste zeigt die drei populärsten freien Lösungen, die als Opcode-Cache und Optimierer verwendet werden können.

Eaccelerator: Von den hier vorgestellten Lösungen ist Eaccelerator die Software, die am längsten auf dem Markt ist. Hervorgegangen aus dem Projekt Mmturk erfreut sich dieser Opcode-Cache bereits seit vielen Jahren großer Beliebtheit. Die Eaccelerator-Erweiterung bietet neben den Caching-Fähigkeiten auch einen experimentellen Optimierer. •Xcache: Xcache ist ein vergleichsweise junges Projekt, das als Unterprojekt des Lighttpd-Webservers entstanden ist und auch weiterhin unter dessen Obhut weiterentwickelt wird. Die Software ist trotz ihres geringen Alters bereits stabil und beachtlich schnell. • APC: Der im Moment wohl leistungsfähigste Vertreter der frei verfügbaren Opcode-Caches, ist APC (Alternative PHP Cache). Dieses Projekt existiert ebenfalls bereits seit einigen Jahren. Dieser Erweiterung kommt vor allem deshalb besondere Bedeutung zu, weil sie im nächsten Major-Release von PHP als Standardlösung enthalten sein wird. Aus diesem Grund und der anerkannten Leistungsfähigkeit ist diese Erweiterung im Moment das Maß der Dinge unter den freien Opcode-Caches.

Zusätzlich zu den genannten kostenfreien Lösungen, wird im Rahmen des Zend-Platform Produktes von Zend ein weiterer Opcode-Cache vertrieben.

Mehr zum Thema

Youtube Sperre umgehen GEMA
Videos freischalten

So umgehen Sie die GEMA-Sperre bei Youtube. Was Sie dazu brauchen, und wie es am einfachsten geht.
Neue Fritzboxen unterstützen den AC-Standard.
WLAN-Geschwindigkeit verdoppeln

Mehr WLAN-Geschwindigkeit: Mit dem WLAN-Standard 802.11ac und den richtigen Geräten und Einstellungen verdoppeln Sie den Datendurchsatz.
Netflix auf dem TV
Programm in der Übersicht

Welche Filme und Serien gibt es bei Netflix eigentlich zu sehen? Was ist neu im Streaming-Angebot? Diese Antworten helfen weiter.
Netflix
Streaming

Preise, kompatible Geräte, Datenrate, Serien- und Filmangebot von Netflix: Wir beantworten die wichtigsten Fragen rund um den Streaming-Dienst.
E.T. – Der Außerirdische
Vorschau auf Film- und Serien-Highlights

Amazon Prime Instant Video lockt im Dezember 2016 mit Film-Highlights wie "E.T.", "Fast & Furious 7" und der Serie "Ku’damm 56​".