20 Tips für schnelleren PHP Code
Geschrieben von Peter Rother • Dienstag, 17. Februar 2009 • Kategorie: Better CodeHeute habe ich für euch ein paar Tips wie ihr euren PHP Code ein wenig schneller und effizienter gestalten könnt. Ich hoffe mal, dass für jeden der ein oder andere Tip dabei ist.
- Falls eine Methode als static deklariert werden kann, sollte dies auch getan werden. Dies erhöht die Geschwindigkeit um das 4fache.
- echo() ist schneller als print()
- Sollten Variablen, Arrays oder Objekte nicht mehr benötigt werden, zerstört sie mit unset().
- Meidet magische Funktionen wie __get(), __set() und __autoload().
- require_once() ist sehr kostspielig.
- Benutzt für include() und require() den vollständigen Pfad.
- Benötigt ihr die Zeit an der ein Script gestartet ist, benutzt $_SERVER[’REQUEST_TIME’] anstelle von time().
- str_replace() ist schneller als preg_replace().
- Es ist besser Switch Statemantes, anstatt große if else Blöcke zu verwenden.
- Das Unterdrücken von Fehlern mit @ ist sehr teuer.
- Schaltet die Apache mod_deflate Extension ein.
- Schließt die Datenbank Verbindungen wenn diese nicht mehr benötigt werden.
- Benutzt, falls möglich, keine Funktionen in Schleifen, da diese Funktionen jedes mal ausgeführt werden.
- Das Hochzählen einer globalen Variablen ist 2mal langsamer als bei einer Lokalen Variable.
- Das Hochzählen einer Objekt Eigenschaft ist 3mal langsamer als bei einer Lokalen Variable.
- Das Hochzählen einer nicht initialisierten Variablen ist 9 -10mal langsamer als bei einer initalisierten Variablen.
- Probiert so viel wie möglich zu cachen. Benutzt hierfür z.B. den Memcache oder eine OP Code Cache. Bei einem OP Code Cache muss das PHP File nicht jedes mal neu kompiliert werden.
- Es muss nicht jede Datenstruktur als Objekt abgebildet werden, ein Array kann hier manchmal genau so helfen.
- Benutzt, falls möglich, das Apache Modul mod_gzip. Das Modul komprimiert die Daten um bis zu 80%.
- Benutzt eine Profiler wie XDebug für eure Scripte, hier könnt ihr schnell Funktionen finden die zu langsam laufen.
Tags für diesen Artikel: performance, php




4 Kommentare
Außerdem sollte man immer im Hinterkopf haben, dass Lesbarkeit immer vor Performance gehen muss. Dahingehend halte ich zum Beispiel nichts von riesigen Switch/Case-Blöcken. Sollte man sie Dennoch benutzen, dann gilt die Devise: Wahrscheinliche Fälle nach oben, unwahrscheinliche nach unten.
Was übrigens auch verdammt teuer (und unsauber) ist: Array-Indizes mit Gänsefüßchen: $array["element"]. Wird nur noch getoppt, wenn man gar keine Delimiter verwendet: $array[element]!
bin gerade auf die Seite gestoßen und will erstmal ein Lob loswerden, hab doch ein paar interessante Sachen gefunden.
Zu deiner obigen Liste und zu dem Kommentar von unset hab ich allerdings doch noch ein paar Fragen, hoffe der Artikel ist noch nicht zu alt, das die auch jmd. mitbekommt.
Bin noch nicht lange im Thema PHP drin, daher schonmal ein 'Tut mir Leid' vornweg, wenn einige Anfängerfragen dabei sind
zu 3. Sind damit generell alle Variablen gemeint? Angenommen ich durchlaufe eine for Schleife und habe dafür den Index $i, sollte ich diesen am Ende der Schleife zerstören? Was genau macht PHP langsamer wenn ich ihn nicht zerstöre, belegt die Variable nicht nur den Speicher? Wie siehts bei Beendigung des Skriptes aus? Werden dann alle Variablen automatisch zerstört?
zu 6. Kann mir grad kaum vorstellen wie durch den relativen Pfad die Geschwindigkeit nach unten gehen soll?! Bringt das tatsächlich signifikante Unterschiede?
zu 12. Baue die Verbindung am Anfang des Skriptes auf, wird dann auch direkt gebraucht, und zwischendurch auch immer wieder und erst am Ende des Skriptes schließe ich sie (wobei ich nicht weiß ob sie nicht auch automatisch nach Ablauf des Skriptes geschlossen würde). Macht es Sinn die zwischendurch zu schließen/öffnen, nur weil dazwichen mal ne Schleife etc. pp. steht?
bzgl. dem Kommentar von unset:
Die Verwendung von Delimitern in Arrays, wie genau ist das zu verstehen. Benutze eigentlich nur numerische Indizes, brauch ich die da auch? Also nicht $array[0] = 1 sondern $array['0'] = 1 ?
erstmal sorry das ich deinen Beitrag erst jetzt frei schalte, ich war aber die letzten Tage Privat nicht vor dem Rechner. Da ich gerade im Büro sitze, und hier noch einiges zu tun habe, werde ich dir die Fragen gerne heute Abend beantworten.
Kommentar schreiben