An den richtigen Stellen schrauben

Teil 3: PHP-Optimierung

  1. PHP-Optimierung
  2. Teil 2: PHP-Optimierung
  3. Teil 3: PHP-Optimierung

Wenn Sie Frameworks wie beispielsweise Symfony Zend Framework oder Cakephp einsetzen, sollten Sie auf keinen Fall auf ein Opcode-Caching verzichten. Durch den Einsatz solcher Frameworks entsteht ein zusätzlicher Overhead an PHP-Quelltext.

Datenbanken

Nahezu jede Webanwendung nutzt Datenbanken, um Informationen dauerhaft zu speichern. Leider wird der Einfluss der Datenbank auf die Gesamtperformance eines Systems gerne unterschätzt. Oftmals wird sehr viel Zeit und Energie in die Optimierung der PHP-Skripte gesteckt und die Datenbank dabei vergessen.Die Optimierungsmöglichkeiten von Datenbankzugriffen ist ein Thema, das allein einen Artikel füllen würde. Prinzipiell gilt es einige Dinge zu beachten, die bereits große Wirkung zeigen.

1. PHP ist kein SQL-Ersatz. Oftmals wird über SQL eine große Datenmenge eingelesen und anschließend durch PHP gefiltert. Dies sollte vermieden werden, denn Datenbanken können solche Operationen meist deutlich schneller ausführen. Dadurch werden SQL-Befehle zwar vielfach komplexer und schwerer zu schreiben, der Performancegewinn, kann aber sehr drastisch ausfallen. 2. Niemals alle Daten auf einmal laden. Nutzen Sie Paging und laden Sie immer nur einen Teil der Daten. Zeigen Sie auf einer Seite nur einen Ausschnitt der Gesamtdatenmenge an und bieten Sie dem Webseitennutzer eine Blätternfunktion. 3. Vermeiden Sie mehrfache Abfragen: Ein Phänomen der objektorientierten Programmierung ist, dass viele Entwickler dazu neigen, Abfragen, die mit einem SQL-Befehl möglich wären, aufzuteilen, weil sie logisch zu unterschiedlichen Klassen gehören. Dies ist natürlich ein enormer Performancenachteil. Mehrfache Abfragen sind logischerweise deutlich langsamer, als ein einziger. 4. Nutzen Sie den EXPLAIN-Befehl von MySQL, um sich von MySQL anzeigen zu lassen, welche Tabellen durch ein SQL-Statement betroffen sind. Dies können Sie in MySQL-Clients wie beispielsweise Phpmyadmin sehr komfortabel vornehmen (Abbildung 3).

PHP-Performance-Optimierung

© Archiv

Abbildung 3: Der EXPLAIN-SQL-Befehl ermöglicht eine detaillierte Aussage über die verwendeten Tabellen einer SQL-Abfrage.

Profiling

Wie wir im Verlauf des Artikels bereits festgestellt haben, sind die Performancebremsen vielfältig. Daher ist es oft nicht ganz einfach herauszufinden, wo genau innerhalb eines langsamen Skriptes die eigentliche Zeit verloren geht. Stellt sich die Frage, wie man diesen Problemen auf die Spur kommen kann.

PHP-Entwicklern stehen hierzu hauptsächlich zwei Werkzeuge zur Verfügung. Für kleinere Skripte genügen einfache Zeitmessungen. Auch hier liefern sowohl Pear als auch das Zend Framework und die Ezcomponents entsprechende Klassen.

Wie in den vorangegangenen Beispielen wollen wir auch hier einen Blick auf die Pear-Implementierung werfen. Das folgende Listing zeigt ein einfaches Beispiel, in dem zwei langlaufende Operationen durch Schleifen imitiert werden.

<?php
require_once('Benchmark/Timer.php');
$timer = new Benchmark_Timer(true);
$timer->setMarker('Start');
for($i=1; $i<200000;$i++) {
$res[] = sizeof($res)*2;
}
$timer->setMarker('Nach Schleife 1');
for($i=1; $i<200000;$i++) {
$res[] = sizeof($res)*3;
}
$timer->setMarker('Ende');
echo $timer->timeElapsed();
?>

Durch die Verwendung der Funktion setMarker werden einzelne Zeitmesspunkte markiert. Am Ende des Skripts gibt die Funktion timeElapsed eine Tabelle mit allen gemessenen Zeiten aus. Abbildung 4 zeigt ein Beispiel hierfür.

PHP-Performance-Optimierung

© Archiv

Abbildung 4: Mit Benchmarking- Klassen lassen sich einfache Aussagen über den Zeitverbrauch innerhalb eines Skriptes treffen.

Damit kann man selbstverständlich nur einfache Skripte durchleuchten. Bei komplexen Programmen sind bessere Werkzeuge notwendig. Dies liegt unter anderem auch daran, dass der Aufruf der Benchmark-Funktionen selbst die Messung verfälscht, da hier ebenfalls Zeit verbraucht wird. Auch ist die Funktionalität in modernen PHP-Anwendungen über sehr viele Dateien und Objekte verteilt, sodass der Einsatz einer zentralen Benchmarking-Klasse sehr umständlich wäre.

Zur Untersuchung des Performanceverhaltens einer komplexen Anwendung sind sogenannte Profile das richtige Werkzeug. Für PHP-Anwendungen hat man die Wahl zwischen mehreren Lösungen:

Advanced PHP Debugger (APD): leistungsfähiger Debugger und Profiler von Georg Schlossnagle. Leider wird die im PECL-Repository verfügbare PHP-Erweiterung bereits seit vier Jahren nicht mehr aktiv entwickelt. •DBG: Zend Erweiterung, die in einer freien und kommerziellen Version verfügbar ist und hauptsächlich innerhalb der PHP-IDE Phped zum Einsatz kommt. •Zend Platform: kostenpflichtige Lösung von Zend , die weit mehr bietet als nur Debugging und Profiling. Allerdings auch nicht sonderlich günstig ist. Wer bereits mit den IDE-Produkten von Zend arbeitet, sollte einen genaueren Blick riskieren, da hier das Profiling sehr gut in die IDE integriert ist. •Xdebug: die wohl populärste freie Debugging- und Profiling-Lösung für PHP ist Xdebug.

Für Xdebug existieren zwar keine so komfortablen IDE-Integrationen, wie dies bei der Zend-Plattform der Fall ist, nichtsdestotrotz sind die verfügbaren Mittel auch für komplexe Anwendungen ausreichend. Die Installation der PHP-Erweiterung ist sehr einfach. Es genügt, die Software von der Projektseite downzuloaden und die Erweiterung in der php.ini-Konfigurationsdatei zu aktivieren. Das folgende Listing zeigt die Aktivierung.

zend_extension_ts="php_xdebug-
2.0.3-5.2.5.dll"
[xdebug]
xdebug.profiler_enable=1
xdebug.profile_output_dir=
"c:/profile/php/"

Ist der Xdebug-Profiler wie gezeigt aktiviert, werden Profiling-Daten in das angegebene Verzeichnis geschrieben. Wenn Sie ein beliebiges Skript starten, werden Sie sehen, dass diese Datei sehr schnell anwächst. Mehrere Hundert MByte sind hier keine Seltenheit. Wenn Sie eine solche Datei in einem Texteditor öffnen, werden Sie von Informationen nahezu erschlagen (siehe Abbildung 5).

PHP-Performance-Optimierung

© Archiv

Abbildung 5: Profile wie Xdebug liefern umfassende Mengen an Daten über den Verlauf einer PHP-Anwendung.

Ein weiteres Tool muss also her, das diese Information sinnvoll aufbereitet. Xdebug schreibt die Informationen im sogenannten Cachegrind-Format. Sie können daher jedes Analysewerkzeug nutzen, das mit diesem Format umgehen kann.

Unter Windows bietet sich Wincachegrind an, unter Linux Kcachegrind. Nach dem Öffnen der Profiling-Datei mit einem solchen Tool bekommen Sie einen sehr schönen Überblick, wo in Ihrer Anwendung die Zeit verbraucht wird. Abbildung 6 zeigt ein Beispiel hierfür.

PHP-Performance-Optimierung

© Archiv

Abbildung 6: Analysewerkzeuge helfen bei der Auswertung von Profiling-Daten.

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​".