Wenn bei der Erstellung von PHP-Code bestimmte Vorgehensweisen bzgl. Performance-relevanter Kriterien eingehalten werden, wird der PHP-Code nicht unnötig langsam gemacht. Hier werden Punkte aufgezeigt, die man bei der PHP Entwicklung berücksichtigen sollte:

Statische Methoden

Statische Methoden sind schneller als eine nicht statische Methode.

Beispiel für nicht-statische Methode:

class foo {
  public function bar() {
  }
}

Beispiel für die statische, schnellere Methode:

class foo {
  public static function bar() {
  }
}

Konstanten/Klassenkonstanten

Da Konstanten bei der Übersetzung in Bytecode schon initialisiert werden (und dadurch auch cachebar), müssen diese nicht zur Laufzeit geparst werden. Konstanten bzw. Klassenkonstanten sind aus Performance-Sicht Variablen vorzuziehen.

require_once/include_once mit Bedacht einsetzen

Intern vergleicht PHP jede Datei, die mit require_once oder include_once eingebunden wird, ob diese schon geladen wurde. Diese Operation ist sehr teuer. Sofern die Struktur des Skriptes schon verhindert, dass eine Datei öfters als einmal eingebunden wird, sollte auf anstelle require oder include verwendet werden.

Absolute Pfadangaben

Werden Dateien über include oder require eingebunden, sollten absolute Pfadangaben verwendet werden:

Schlecht:

include 'bootstrap.inc';

Hier wird in jedem Verzeichnis nach der Datei bootstrap.inc gesucht, welche im include_path aufgeführt sind. Sieht der include_path wie folgt aus:

include_path = ".:/usr/share/php:/var/share/php5:/var/www/include";

werden 4 Verzeichnisse nach der Datei bootstrap.inc durchsucht (das aktuelle Verzeichnis und 3 weitere). Die Reihenfolge wird hierbei beachtet, wie die Verzeichnisse im include_path gelistet sind. Das aktuelle Verzeichnis wird also als erstes durchsucht, ‘/var/www/include’ als letztes. Wenn man keine Möglichkeit sieht absolute Pfadangaben machen zu können, sollte zumindest versucht werden die Anzahl der Verzeichnisse im include_path auf ein Minimum zu reduzieren.

Besser:

constant('PROJECT_DIR', '/var/www');
include PROJECT_DIR . '/bootstrap.inc';

Zeichenvergleich

Sofern keine reguläre Ausdrücke erforderlich sind, sind Funktionen wie strcmp, substr, substr_count zu bevorzugen. Ist der Einsatz von regulären Ausdrücken unumgänglich, sollten sie nur für ganz konkrete Fälle verwendet werden:

if (!strcasecmp('foo_', 'foo', 3)) {
 // hier er komplexe preg_match Aufruf
}

Zeichenersetzung

Bei der Zeichenersetzung wird Speicher benötigt. Bevor eine Ersetzung durchgeführt wird, sollte überprüft werden, ob das Suchmuster für die Ersetzung überhaupt vorhanden ist.

$foobar = 'foobar'
if (substr_count($foobar, 'foo') {
  str_replace('foo', 'bar', $foobar);
}

Fehlerunterdrückung

Mit dem @-Operator kann man Fehlermeldungen unterdrücken, wie im Beispiel:

@myssql_connect($host, $user, $pass);

Die Unterdrückung der Fehlermeldung wird PHP intern dann ähnlich wie folgt lösen:

$status = ini_set('error_reporting', 0);
@myssql_connect($host, $user, $pass);
ini_set('error_reporting', $status);

Anstelle dessen, sollte komplett auf die Ausgabe von Fehlermeldungen verzichtet werden und stattdessen Error-Logdateien oder das Syslog des Systems verwendet werden.

Konstantenmissbrauch

Verwendung einer Konstante als Array Schlüssel:

$foo = array('bar' => 1);
echo $foo[bar];

Hier geht PHP wie folgt vor: 1) strtolower() 2) Die Suche im Array 3) eine E_Notice wird geworfen 4) ein temporärer String ‘bar’ wird erstellt, um auf den Hash-Wert zugreifen zu können

Richtiger Einsatz:

$foo = array('bar' => 1);
echo $foo['bar'];

Beide Varianten unterscheiden sich nur durch die einfachen Anführungszeichen in der zweiten Zeile. Aus Performance-Sicht ein riesen Unterschied.

Funktionen in Schleifen

Funktionsaufrufe innerhalb von Schleifen sollten vermieden werden.

Schlecht:

for ($i = 1; $i <= count($array); $i++) {
  echo $i;
}

Bei jedem Schleifendurchlauf wird die Funktion count ausgeführt.

Besser:

$max = count($array);
for ($i = 1; $i <= $max; $i++) {
  echo $i;
}

Aktualisiert: