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.
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
<?php $new = array_values($temp); ?>
Man hat hier zwar ein neues Array $new, aber das ist die schnellste Methode.
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.
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?
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.
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); ?>
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’; ?>
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 . “!”; ?>
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.
Hier sollte man nicht tricksen und einfach die Funktion isset verwenden. Anwendung:
<?php $var2 = isset($var) ? $var : ”; ?>
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.
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(); ?>
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.
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!
Die Funktionen unset und mysql_free_result sollten auf jeden Fall verwendet werden, damit nicht gebrauchte Daten aus dem Arbeitsspeicher verschwinden.
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.
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.
http://www.fudnik.com/main/tiki-view_forum_thread.php?forumId=1&comments_parentId=2
http://www.thegeek.de/blog/index.php?type=archiv&post=200412
Zum Inhaltsverzeichnis