Performanzoptimierung von PHP-Anwendungen

Chaosengel_Gabriel

Erfahrenes Mitglied
Guten Tag verehrte Tutorials-Gemeinde.
Ich habe mir inzwischen eine serverseitige Anwendung mittels PHP erstellt... Es läuft auch soweit alles super...
Da die Anwendung für den lokalen Betrieb (XAMPP) gedacht ist, möchte ich mich nun etwas um Leistungsoptimierung kümmern und bräuchte da einige Anregungen/Stichworte/HowTos...
Ich möchte Zeiten messen von einzelnen Funktionen und SQL-Abfragen und vorallem den RAM-Verbrauch der Anwendung im Dauerbetrieb im Auge behalten, also analysieren welche Variablen möglicherweise unnötigerweise nach der Laufzeit weiter existieren und ähnliches...

Also im Großen und Ganzen versuche ich mich zum ersten mal bewusst und intensiv mit der Leistungsoptimierung von PHP-Anwendungen auseinanderzusetzen und brauch da nen bissi Wegweiser, damit ich weiß wohin ich schauen muss und wonach ich suchen sollte :)
 
Nach der Laufzeit existiert bei PHP nichts mehr weiter und frisst damit Ressourcen.

Was du machen kannst ist eine Laufzeit Optimierung, durch z.B. joins bei Sql-Abfragen bzw. durch Optimierungen der Abfragen.
So kannst du z.B. solche Abfragen
PHP:
foreach ($conn->query( "select a from tablea" ) as $row ) {
   foreach(  $conn ->query( "select * from tableb where b = " . $row['a'] ) as $row2 ) {
      echo $row2['b'];
   }
 }

Durch solche
PHP:
$sql  = "select b.* from tablea a";
$sql .= "inner join  tableb b on b.b = a.a";
foreach ($conn->query( $sql ) as $row ) {
    echo $row2['b'];
 }

ersetzen und an Laufzeit sparen.

Zum messen von Laufzeiten kannst du innerhalb des Codes Timestamps z.B. mit microtime( ) setzen und die Differenz zwischen
zwischen den Timestamps als Teillaufzeit bzw. Gesamtlaufzeit nutzen.

Damit könntest du feststellen, wo die Ressourcen fressen sitzen.
 
mir war aufgefallen, dass der ram bedarf des apache prozesses nach gut ner woche bis zu 200mb mehr ram verbraucht, daher ging ich davon aus, dass langzeitig gespeicherte daten im ram zurück bleiben...

bezüglich der performanz der laufzeit hab ich hier noch 2 interessante seiten gefunden:
http://floern.com/webscripting/geschwindigkeit-von-php-scripts-optimieren
http://www.drweb.de/magazin/schneller-php-schneller/

was mir dann noch fehlen würde wäre optimierung hinsichtlich der sql abfragen...
mysql oder mysqli? fertige klasse oder ruhig selber was kleines scripten?
 
Ehrlich gesagt werden bei diesen Links Mikrooptimierungen vorgestellt, die für jede normale Anwendung eigentlich unnötig sind.
Es gibt einen bekanntes Zitat von Donald Knuth:
Premature optimization is the root of all evil.
(Voreilige Optimierung ist die Quelle allen Übels.)

Ich würde dir raten, unter Zuhilfenahme eines Profilers die Laufzeiten einzelner Funktionen, IO-Aufrufe oder externer Aufrufe (z. B. DB) anzeigen zu lassen. Dadurch erhälst du ein realistisches Bild von dem eigentlichen Performanceproblem.

was mir dann noch fehlen würde wäre optimierung hinsichtlich der sql abfragen...
mysql oder mysqli? fertige klasse oder ruhig selber was kleines scripten?
Zwischen mysql und mysqli drängt sich gar nicht die Frage auf, welches man benutzen solle. Eindeutig MySQLi! Die Erweiterung MySQL (ohne i) ist nämlich veraltet und wird bald entfernt.
Eventuell solltest du noch PDO zurate ziehen.
Generell empfehle ich fertige Klassen, da du dir so Arbeit sparst und bereits ein reiferes Produkt in Händen hälst. Zum Beispiel werden weniger Fehler existieren, da das Produkt von viel mehr Leuten entwickelt und genutzt worden ist. Auch gibt es eine Dokumentation, eine (kleine) Community etc.

Zu Lernzwecken kannst du natürlich trotzdem eine eigene Klasse erstellen.
 
Erstmal herzlichen Dank für die vielen Anregungen.

jeipack normalerweise magst du recht haben, aber ich nutze PHP gerne für lokale Anwendungen, wobei mir HTML lediglich als GUI dient.
Ihr habt aber durchaus recht, das Hauptoptimierungspotenzial sehe ich auch in den MySQL Abfragen, allerdings ist für mich die Microoptimierung nicht völlig sinnfrei, da meine Anwendungen lokal betrieben werden sollen und das ohne andere Anwendungen zu beeinflussen.

Ich hab mir diese DB-Klasse ausgesucht:
http://justinvincent.com/ezsql

Scheint schön flexibel und schnell zu sein, wie ich es brauche.

In Hinsicht auf die DB-Abfragen hab ich noch eine Frage.
Ich nutze in meinem Projekt öfters die "INSERT INTO ... ON DUPLICATE KEY UPDATE..." Funktion.
Wäre es schneller, unter Verwendung o.g. DB-Klasse, zuvor ein SELECT auszuführen und anhand des Ergebnisses selbst zu entscheiden, ob INSERT oder UPDATE !?
 
Also ich denke, wenn du einfach theoretisches Wissen sammeln willst ist das Forum das falsche Medium.
Es gibt Tonnen von nützlichen Links über PHP Optimierung.
Einfach mal nach "php performance optimization" googlen.
Hier zB:
http://www.thegeekstuff.com/2014/04/optimize-php-code/
Oder auch grosses Thema, Caching:
https://blog.engineyard.com/2014/profiling-with-xhprof-xhgui-part-3

Oder alternativ du suchst dir die Stellen in deinem Code raus die Performanceschwierigkeiten machen und postest dann konkrete Fälle hier, dafür ist ein Forum dann viel besser geeinget.
Hier ganz einfach wie du Zeiten messen kannst:
http://www.strassenprogrammierer.de/ausfuehrungszeit-in-php-5-messen_tipp_418.html


Zu deiner Frage: Du weisst jetzt wie man Zeiten misst, also beantworte die Frage doch gleich selbst und teile uns das Ergebniss mit ;) Wobei ich relativ sicher bin welche Variante gewinnen wird.

Grüsse
 
Ganz allgemein zu Datenbanken:
* Immer auf konkrete Spalten suchen ("SELECT col1,col2 FROM table" statt "SELECT * FROM table"),
* Bei häufigen/umfangreichen Abfragen überlegen, ob es sich nicht lohnt eine VIEW zu basteln.
* Gelegentlich ein "OPTIMIZE table" ausführen
* Nicht bei jeder (aber bei doch vielen) Datenbanken ist die Normalisierung hilfreich.
* Index gut auswählen.
 
Zu so „C. Namen der Variablen kürzer 8 Zeichen (Performance-Gewinn 15%)“-Artikeln (http://www.drweb.de/magazin/schneller-php-schneller/) muss ich doch auch noch mal was sagen.

Das ist so das Äquivalent zu: Du legst dir abends die Unterhose für den nächsten Tag schon raus, damit du beim Anziehen 50 % Zeit sparst, weil du sie nicht erst noch aus dem Schrank kramen musst. Das klingt nach einer wesentlichen Optimierung (immerhin 50 %), aber wenn du diese Handlung im größeren Kontext (Morgenroutine, Arbeitsweg, …) betrachtest, wird sofort offensichtlich, dass du lediglich eine einzelne Sache, die sowieso schnell geht, beschleunigst, dass das aber keinen nennenswerten Einfluss auf die Gesamtzeit hat, weil du dann zum Beispiel so oder so noch 35 Minuten Fahrzeit vor dir hast.

Deshalb ist es sehr viel wichtiger, erst mal zu identifizieren, was überhaupt den Großteil der Zeit verbraucht. Wie man das misst, wurde ja schon gesagt (zum Beispiel per microtime oder per Profiling mit etwa xdebug).

Ein weiteres wesentliches Problem mit derartigen Artikeln zur „Mikrooptimierung“ ist, dass es gar nicht so leicht fällt, aus den Ergebnissen allgemeingültige Regeln abzuleiten. Das liegt zum Beispiel daran, dass intern an PHP von Version zu Version natürlich auch geschraubt wird. Aussagen, die für eine Version zutreffen, müssen das nicht zwangsläufig auch für eine neuere Version tun. Beispielsweise enthält PHP seit Version 5.5 einen integrierten Bytecode-Cache. Dessen Einführung ist einerseits ein gewaltiges grundsätzliches Performance-Plus (so im Sinne von Transrapid vs. normale Eisenbahn) und eröffnet andererseits in der Zukunft Möglichkeiten für weitere automatische Optimierungen von Quellcode.

Dann hängt der Effekt von Optimierungen nicht selten mit den zu verarbeitenden Daten zusammen. Es gibt Ansätze, die effizient für kleine Datenmengen arbeiten, die aber schlecht skalieren, die also bei größeren Datenmengen schnell sehr langsam werden. (Das kennt man vielleicht auch von Editoren, die völlig überfordert sind, wenn man mal eine 30-MB-Datei damit öffnet.) Es gibt außerdem Ansätze, die genau gegenteilig funktionieren und gut skalieren, aber dafür einen grundsätzlichen initialen Overhead haben. Daher stammt die Aussage: Trau keinem Benchmark, den du nicht selbst gefälscht hast. Benchmarks messen nicht zwangsläufig realistische Anwendungsszenarien.

Ein neuerer Thread zu derlei Themen auf php.de: http://www.php.de/forum/webentwickl...0-funktionen-optimiert-auf-geringste-laufzeit
 
mermshaus: Du ahst es richtig drauf mit erklären! Schon mal dran gedacht Unterricht zu geben? Der Unterhosenvergleich ist 1A ;D

Zu dem Punkt bezüglich nur 8 Zeichen für Variabelnamen: Bei grossem Code finde ich geht das gar nicht, da muss eine Variable richtig aussagekräftig sein, zum Beispiel ' countFussballfaelder' und nicht 'cnt_Fbf'. Die Microsekunde die man dabei Sparen würde nehme ich gerne in Kauf für bessere Lesbarkeit.
 

Neue Beiträge

Zurück