PHP: Performance verbessern

cr4m0

Angesehenes Mitglied
Ich beschäftige mich im Moment damit, die Performance meiner Seite zu verbessern, die ich mit PHP programmiert habe. Als Datenbank nutze ich MySQL. Dazu habe ich zwei angeblich gute Methoden gefunden. Könnt ihr etwas dazu sagen, habt ihr sie vielleicht schon getestet?

1) GZip-Komprimierung verwenden, dafür gibt es "http://hx3.de/software-webentwicklung-23/tutorial-g-e-zip-pt-surft-sichs-besser-9764/" mit mehr Komfort
2) Cache für die PHP-Seiten verwenden, z.B. durch "http://sourceforge.net/projects/quickcache/"
3) Cache per HTML-Datei, Anleitung auf "http://phpperformance.de/ausgaben-in-cache-speichern/"
4) Puffer durch ob_start / ob_get_clean
 
Sind denn die Datenbank-Abfragen auch schon optimiert? Je nach Größe der Datenbank kann sowas ja auch die Performance der Seite stark beeinflussen.

Caching habe ich bei eigenen Skripten noch nicht selbst eingesetzt, aber ich habe mal gelesen, dass sich damit die Performance je nach Aufbau der Seite stark beschleunigen lässt.
 
4.) APC / eAccelerator etc. verwenden.
- für a.) Opcache
- für b.) Ergebnisse im Memory speichern.

5.) z.B. mit Xampp eine profiling-Datei erstellen mit wincachegrind analysieren und langsame Stellen optimieren.
6.) Ergebnisse in serialized Arrays ablegen
7.) wenn man echt verzweifelt ist php-Optimzier mit 4.) kombinieren oder alleine verwenden.

und die Datenbank Abfragen (wenn komplex) optimieren!!
 
OK, Danke schonmal für eure Antworten.

eAccelerator ist auch ein Open-Source-Produkt zum Erstellen eines Cache für PHP-Seiten. Dafür muss man aber Änderungen an der Serverkonfiguration vornehmen, was ich nicht darf (Shared Hosting). Bei JPCache muss man das nicht machen.

Danke auch schonmal für die ganzen anderen Tipps, die werde ich mir bald auch mal genauer ansehen.

Mich würde aber noch mehr interessieren, welche Erfahrungen ihr mit den ersten vier Methoden (mein erster Beitrag) gemacht habt und ob ihr diese empfehlen könnt.
 
Zuerst kommt die Diagnose, dann kann man sich um die richtige Kur bzw. die passende Medizin Gedanken machen.

Sprich: Auch mit PHP-Kenntnissen könnte ich jetzt noch gar nix sagen - und sollte auch nichts sagen.

5 Beispiele:
  • 1. PHP-Code holt sich eine Tabelle mit 1000 Zeilen und führt für jede Zeile vom Ergebnis eine neue Sql-Abfrage aus, das ganze dreimal in jeder Seite
  • 2. PHP-Code macht eine einzige Abfrage - aber innerhalb dieser wird eine 5-GB-Tabelle per Fullscan durchsucht, Indices fehlen oder werden aufgrund der Struktur der Abfrage nicht genutzt.
  • 3. Die Ausführung dauert 0.01 Sekunden - aber jede Seite hat drei zufällige 5-MB-Bilder.
  • 4. Aufgrund von irgendeinem Fehler erzeugt die Verarbeitung einer Seite eine 50%-Prozessorauslastung. Bei hinreichend vielen Nutzern ist der Prozessor dicht.
  • 5. Der Server ist prinzipiell unterdimensioniert und swapt deshalb ständig.
In allen fünf Fällen sieht die Kur / die Medizin anders aus.

Sprich: Erst einmal die zeitraubenden Stellen identifizieren.

Anmerkung zum GZIP: Der oben zitierte Artikel verweist in den Features auf ein Problem:
QUOTE - Die Kompression passt sich an die Serverload an, d. h. ist der Server sehr ausgelastet wird die Kompression runtergesetzt


GZIP erzeugt zusätzliche Prozessorlast. Wenn (4) oder (5) das Problem wäre, dann würde sich das mit GZIP womöglich noch verschlimmern.
 
OK, das stimmt wohl. Aber es gibt ja auch Verbesserungen, die grundsätzlich durchgeführt werden können und immer helfen. Zum Beispiel ist mysql_fetch_assoc immer schneller als mysql_fetch_row, mysql_fetch_array und mysql_fetch_object. Deshalb habe ich diese Funktionen schon ersetzt.

Bei GZip habe ich jetzt eingesehen, dass es nicht das Beste ist. Aber es gibt ja noch drei Möglichkeiten zum Verbessern der Performance, die ich genannt habe:
1) Cache für die PHP-Seiten verwenden, z.B. durch "http://sourceforge.net/projects/quickcache/"
2) Cache per HTML-Datei, Anleitung auf "http://phpperformance.de/ausgaben-in-cache-speichern/"
3) Puffer durch ob_start / ob_get_clean
Wie findet ihr diese Möglichkeiten? Sind sie sinnvoll?
 
Ich würde Dir vorschlagen, Dir vor jeglicher Optimierung den Rat von Jürgen zu Herzen zu nehmen.

Wenn Du nicht weisst, was Deine Seite ausbremst, ist jegliche Optimierung ein Fehler. Du steckst nämlich Arbeitszeit in etwas, das überhaupt kein Problem ist. Und riskierst es, durch die unnötige Änderung Fehler oder Inflexibilitäten einzubauen.

Ich kenne das selbst von manchen Kunden; großen wie kleinen. Sie wollen ihr Projekt gerne starten, und es soll möglichst heute noch losgehen. Aber eigentlich wissen sie gar nicht, wohin. Und wenn man sich ans Motto: "Wohin? Weiss nicht. Aber erst mal losgehen!" hält, läuft man manchmal auch vom Ziel weg.

Abgesehen vom Grundsätzlichen finde ich die Sammlung mit Optimierungs-Tipps aber schick!
 
Ich habe einige Artikel auf "http://www.phpperformance.de/" gelesen. Da werden PHP- und MySQL-Anwendungen getestet und in der Performance verglichen. Diese Seite kann ich jedem empfehlen, die Artikel sind sehr gut und es gibt auch viele Kommentare und Tipps von anderen Leuten da.
Laut dieser Seite bringen bestimmte Veränderungen immer Vorteile, z.B. mysql_fetch_assoc statt den anderen Möglichkeiten. Diese Veränderungen meinte ich. Deshalb wollte ich auch wissen, ob ihr Erfahrungen mit den folgenden Möglichkeiten habt:
1) Cache für die PHP-Seiten verwenden, z.B. durch "http://sourceforge.net/projects/quickcache/"
2) Cache per HTML-Datei, Anleitung auf "http://phpperformance.de/ausgaben-in-cache-speichern/"
3) Puffer durch ob_start / ob_get_clean

Von Jürgens aufgelisteten Problemem sind 1-3 auf keinen Fall bei mir vorhanden. 4 und 5 im Moment auch nicht. Mir geht es auch nicht darum, dass meine Seite einen Fehler hat und eine riesige Auslastung hat. Ich möchte nur alles optimieren, damit die Seite auch möglichst hohe Besucherzahlen aushält, ohne dabei Ladezeiten von 5 Sekunnden bei DSL zu haben...
 
Mit Caching habe ich ein wenig Erfahrung. Es schränkt die Dynamik Deiner Seiten immer ein bisschen ein. Wenn Du eine nennenswerte Zahl an Seiten hast, bei denen sich nichts ändert, ist File- oder Speichercaching aber sehr sinnvoll. Persönlich würde ich da - wie Du vielleicht schon vermutest - rein gar nichts machen, solange es keine Lastprobleme gibt. Ich finde die Zeit dann besser in Content und Usability aufgehoben.
 
PHP/MySQL Tuning vornehmen (ich hatte irgendwo selbst ein Paar Beiträge dazu geschrieben), irgendeinen Optimizer/Accelerator (Ich glaube ich habe Zend Optimizer drauf) installieren, ein Paar Indexe hier und da hinzugeben, an den Ressourcen-Zuweisungen in MySQL.ini etwas drehen...
das sollte für den Durchschnitts-Server bereits genügen.

Wenns nicht gerade eine Riesen-Seite ist und der Server eh etwas unterdotiert in RAM ist (z.B. alles unter 1 GB), kann es sich lohnen, einfach 1 GB mehr RAM einzuschieben, und etwas besseres mit seiner Zeit anzufangen.

Komprimieren (Gzip) dient etwas völlig anderem, und zwar reduziert es stark den Traffic, der durch Text-lastige Seiten verursacht wird.
 
Ich möchte nur anmerken dass das Komprimieren bei sehr vielen Servern sehrwohl eine wesentliche Verbesserung der Serverperformance bewirken kann, das hängt aber davon ab was der Flaschenhals ist.
Die Anzahl der Requests an den Server läst sich so ordentlich senken, das sollte man nicht unterschätzen.

Läst sich aber recht leicht ausprobieren, danach weiß man sicher mehr…
 
Ich hatte, nachdem ich lange Zeit mit einer schlechten Server-Performance kämpfte, einen PHP-Profiler eingesetzt und damit analysiert, welche Scripte bzw. Scriptfragmente die meiste Zeit benötigen, denn das ist meistens auch gleichbedeutend mit der CPU-Last.

In dem Fall hatte ich auf http://xdebug.org/ gesetzt, ein Modul, was allerdings serverseitig eingerichtet werden muss. Jedoch kannst du ja dein Web auf einem lokalen System daheim aufsetzen und dort xdebug einrichten und damit Analyse/Diagnose betreiben. Manchmal kann ein kleines Script eine große Wirkung haben, zumindest war's in meinem Fall so.
wink.gif


Falls du außerdem einen Shellzugriff hast, kannst du mit top (für Systemprozesse) und mytop (für mySQL-Prozesse) sehen, welche Prozesse viel Rechenkapazität benötigen.
 
OK, wenn ich mal einen eigenen Server habe, kann ich das nutzen. Im Moment habe ich ja noch Shared Hosting und kann das alles nicht nutzen.

Aber was haltet ihr davon, PHP-Seiten für eine bestimmte Zeit in HTML-Dateien als Cache zu speichern?
Beispiele:
- http://phpperformance.de/ausgaben-in-cache-speichern/
- http://sourceforge.net/projects/quickcache
Dadurch müssen die Seiten für eine bestimmte Zeit (z.B. 5 Minuten) nicht mehr "zusammengebaut" werden, dadurch muss der PHP-Parser nicht mehr laufen und es ist kein MySQL-Zugriff mehr nötig. Und in 5 Minuten ändern sich eh die wenigsten Seiten...
 
So oft wie du nachfragst hättest du es testweise schon wo einbauen können ;-)

Auch bei Seiten die sich jedes mal ändern kannst du cachen, und zwar einfach die Teile, die sich nicht ändern. Klar bringt das war von Fall zu Fall was (immer schön testen und messen!).

Willst du die vom Besucher wahrgenommene Zeit verbessern kann ich übrigens das Tutorial von Yahoo empfehlen:
http://developer.yahoo.com/performance/rules.html
 
OK, ich hab's jetzt getestet!
biggrin.gif

Das Caching funktioniert auf jeden Fall. Große Geschwindigkeitsvorteile gibt es nicht, aber auf jeden Fall wird ja die Server-Last reduziert. Denn jetzt müssen die Inhalte nur noch aus HTML-Dateien geladen werden und nicht mit einer MySQL-Verbindung geladen und zusammengesetzt werden.
Allerdings braucht man beim Caching viel Speicherplatz, da ja für jede einzelne Seite per Parameter auch eine eigene HTML-Datei erstellt wird.
 
Zurück
Oben