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

HTML5: Quick Reference Guide
Ratgeber: "HTML5"

Die wichtigsten Tags auf einen Blick: In unserem praktischen Arbeitsblatt finden Sie einen wertvollen Begleiter für die Umstellung Ihrer Webprojekte…
internet, webdesign, google, content, ranking, seo, suchmaschine
Ratgeber: Urheberrecht

Einzigartige Inhalte bieten Lesern Mehrwert und sind ein wichtiges Qualitätsmerkmal. Ärgerlich, wenn sich jemand durch Kopieren an fremden Ergebnissen…
Die besten HTML5-Tipps
Neue Tipps & Tricks für blitz.io

Wer die Leistung einer Applikation ermitteln möchte, braucht keine Skripte zu schreiben, sondern kann einen der zahlreichen Online-Dienste einspannen.…
image.jpg
Ratgeber: Webentwicklung

Die clientseitige Javascript-Entwicklung bietet fast keine Entwicklungsumgebungen und auch keine vernünftigen Werkzeuge zur Fehlersuche. Eine der…
internet, webdesign, meteor, webapplikationen
Ratgeber

Mit Meteor sollen Entwickler in kurzer Zeit Umgebungen für Webapplikationen erstellen können, ohne sich um lästige Details kümmern zu müssen. Wir…