Fit4Php – Php Tutorial - Php für Einsteiger und Fortgeschrittene
Laufzeitoptimierung für schnellere Webseiten

Wie kann man seine PHP-Scripts schneller machen ohne auf einen schnelleren Server umziehen zu müssen? Wie Sie sehen werden, ist das gar nicht so schwer.

Allgemeine Merk-Regeln

Es ist wie in der Schule: Man muss nichts lernen, wenn man den Stoff begriffen hat. Deshalb hier ein paar wichtige Hinweise vorab:

  • Immer die PHP-eigenen Funktionen statt den eigenen Nachbau verwenden
  • Je weniger Code eine Funktion benötigt, desto höher ist die Wahrscheinlichkeit, dass der Code schneller läuft
  • Es nicht übertreiben: Man sollte seine Scripte optimieren, aber auch seinen eigenen Stil behalten
Ein Array, aus dem Elementen gelöscht wurden, neu indizieren
<?php
$new = array_values($temp);
?>

Man hat hier zwar ein neues Array $new, aber das ist die schnellste Methode.

Ein Array Element für Element durchgehen:

Man sollte sich angewöhnen, vor dem Durchlauf eines Arrays die Anzahl der Elemente zu ermitteln.

<?php
$count = count($arr);
for($i=0; $i<$count; $i++) {
// hier etwas mit $arr[$i] tun
}
?>

Wenn man nämlich innerhalb der for-Schleife, also for($i=0; $i<count($arr); $i++), vor jedem Durchlauf die Anzahl der Elemente festellt, obwohl diese konstant bleibt, kostet es unnötige Rechenleistung.

Den Inhalt einer Datei in einen String auslesen

PHP spricht hier für sich:

<?php
file_get_contents (string filename [, int use_include_path])
// Liest den gesamten Inhalt einer Datei in einem String.
?>

Auch hier gilt: Warum das Rad neu erfinden, wenn PHP doch seine eigene Funktion zur Verfügung stellt?

Schneller vergleichen

Kurz gesagt: Man sollte sich bemühen, den Trinitäts-Operator (Sehr gute Erklärung auf phpbar.de) zu benutzen. Beispiel:

<?php
$wort = ($zahl == 1) ? ‘eins’ : ‘keine eins’;
?>

Diese Methode ist meiner Meinung nach etwas unübersichtlich, aber schneller als normale If-Else Anweisungen.

Einen String ersetzen

Wenn man in einem Text mehrere unterschiedliche Strings ersetzen möchte, sollte man einfach auf Überischtlichkeit des Quellcodes achten, indem man einzelne str_replace-Anweisungen benutzt. Und das ist zugleich die schnellste Methode. Beispiel:

<?php
$text = str_replace(‘Hans’, ‘Rudolf’, $text);
$text = str_replace(‘Daniela’, ‘Veronika’, $text);
?>
Ausgabe von Strings ohne Variablen

Den Text sollte man in einfachen Anführungszeichen (‘) schreiben, weil PHP da nicht nach Variablen sucht, die durch Werte zu ersetzen sind. Beispiel:

<?php
echo ‘Dies ist ein schneller Text’;
?>
Ausgabe von Strings UND Variablen

Hier sollte man doppelte Anführungszeichen (“) für Strings verwenden, die durch den .-Operator mit den Variablen verknüpft werden:

<?php
echo “Der Inhalt der Variable text lautet:. $text .!;
?>
Ausgeglichen sein bei der Ausgabe (allgemein)

Man sollte sich nicht unbedingt auf diese beiden oben genannten Möglichkeiten festlegen. Weil jede trotzallem ihre eigenen Vorteile hat. Beispiel:

<?php
echo<img src=”bild.jpg” />. $beschreibung;
?>

Innerhalb einfacher Anführungszeichen kann man ohne zu escapen doppelte verwenden und gleichzeitig eine Variable anfügen. Oder:

<?php
echo “Dies ist ein ’Text in einfachen Anführungszeichen’ … !;
?>

In diesem Fall gilt ähnliches: Einfache Anführungszeichen in doppelten.
Sie sehen, dass man einfach abwägen sollte, wo welche Anführungszeichen hingehören und wo man sich eher an die zwei oben genannten Tipps halten sollte.

Prüfen, ob eine Variable vorhanden ist

Hier sollte man nicht tricksen und einfach die Funktion isset verwenden. Anwendung:

<?php
$var2 = isset($var) ? $var :;
?>
Arrays/Objekte als Parameter

Man sollte sich auch angewöhnen, Arrays oder Objekte, die von einer Funktion verändert werden sollen, einfach per Referenz zu übergeben, weil eben nicht der Inhalt des Arrays/Objektes der Funktion übergeben wird (und somit eine Kopie davon gemacht werden muss), sondern nur die Referenz auf ein bereits vorhandenes Array oder Objekt. Code:

<?php
function mach_was_mit_array( &$arr ) {
// hier wird das Array $arr verändert …
}
$namen = array(‘Bob’, ‘Hans’, ‘Rudolf’);
mach_was_mit_array($namen);
?>

Nebenbei erwähnt, braucht man bei der Referenzierung nicht mal einen Rückgabewert und spart also auch hier Arbeitsspeicher.

Schnellere Ausgaben für Template-Systeme

Wenn man Templates benutzt, wird oft der Inhalt der Ausgabe nach und nach in einen String geschrieben. Dieser wird dann auf einen Schlag ausgegeben. Die Idee ist zwar gut, lässt sich aber mit PHP-eigenen Funktionen schneller realisieren. Anstatt die Ausgaben in eine eigene Variable zu speichern, kann man den PHP-Puffer verwenden. Man beginnt eine “Aufnahme” in den PHP-Puffer mit ob_start(), schreibt dorthin mit echo oder print und gibt anschließend die gespeicherten Ausgabedaten mit ob_end_flush() an den Browser aus:

<?php
ob_start();
echo ‘Laaanger Text, der nach und nach immer groesser wird …’;
ob_end_flush();
?>
Beim Programmieren vorher nachdenken

Man sollte seine if-else und switch-Anweisungen der Häufigkeit nach ordnen. Wenn die Wahrscheinlichkeit größer ist, dass die Bedingung $x<0 zutrifft, dann sollte diese auch oben stehen:

<?php
if($x<0)
 echo ‘negativ’;
elseif($x>0)
 echo ‘positiv’;
else
 echo ‘genau mittendrin’;
?>

Dasselbe gilt für Bedingungen, die miteinander verkettet werden:

<?php
if( $rechnen == 1 && $x>0 )
echo ‘Berechnung: positiv’;
?>

Wenn wir nicht rechnen möchten ($rechnen ist also nicht auf 1 gesetzt), dann wird PHP die Bedingung $x>0 gar nicht beachten, weil ja gar nicht rechnen möchten! Auch sollte man Schleifen mit continue in die nächste Runde schicken oder gar mit break abbrechen wenn die nachfolgenden Anweisungen für den restlichen Ablauf überflüssig sind.

PHP entlasten

Wenn es in MySQL Funktionen gibt, die man gebrauchen könnte, dann sollte man diese auch verwenden. Beispiel:

<?php
$result = mysql_query(‘SELECT CONCAT(name,vorname) FROM personen’);
?>

Hier wird also die MySQL-eigene Funktion CONCAT benutzt, um den Namen mit dem Vornamen zu verbinden. Man braucht also keine PHP-Funktionen dafür zu verschwenden!

Speicher ggf. freigeben

Die Funktionen unset und mysql_free_result sollten auf jeden Fall verwendet werden, damit nicht gebrauchte Daten aus dem Arbeitsspeicher verschwinden.

Nicht so viel Code auslagern

Je mehr Code man in Dateien auslagert, desto mehr muss man ihn per include o.ä. wieder einbinden, was die Festplatte rattern lässt, weil dieser ja einen zusätzlichen Dateizugriff erfordert. So sollte man auch hier den goldenen Mittelweg gehen: Soviel Quelltext in separate Dateien auslagern wie nötig.

Zusammenfassung und Fazit

Wenn Sie es sich angewöhnen, diese wenigen Regeln zu beachten werden Ihre PHP-Anwendungen schneller. Denken Sie jedoch auch daran, dass man mit diesem ganzen Fine-Tuning den Spaß am PHP-Programmieren nicht verlieren, sondern steigern möchte.

Dies ist ein Gastbeitrag von Robert Preis.

Quellen

http://benchmark.nophia.de/

http://www.fudnik.com/main/tiki-view_forum_thread.php?forumId=1&comments_parentId=2

http://blog.antikoerperchen.de/beitrag/57/traffic-und-serverlast-in-den-griff-bekommen-website-geschwindigkeit-steigern.html

http://www.thegeek.de/blog/index.php?type=archiv&post=200412

Zum Inhaltsverzeichnis