Serverauslastung bei Scripten

Hallo beisammen, liebe Experten :wink:

ich habe mir in letzter Zeit immer wieder die Frage wie man am besten möglichst Serverentlastend programiert, gestellt.
Im vordergrund stehen für mich drei Dinge…

Macht es einen Unterschied ob man mit Funktionen arbeitet, die in einer separaten Datei includiert werden oder ob man doch lieber die Funktionen in die einzelnen Scripte stecken sollte und gefahr laufen dass man mehrer Funktionen doppelt korrigieren muss…

Etwas anderes sind die mysql-abfragen (auch wenns nur halb hierher gehört). Macht es Sinn einmal ein "select * " zu wählen und dann die jeweilige Variable per global-funktion in die jeweils nötigen Funktionen mit zu übernehmen? Oder ist es klüger jedesmal neue selects zu machen und nur das aus der Datenbank zu holen, was man auch braucht?

Zuletzt noch: Macht es einen Unterschied ob ich die verschiedenen Funktionen per „switch“ anweise oder ein if ($action == „value“) funktion(); verwende? Schliesslich kann es mitunter durchaus praktischer sein die zweite Methode zu verwenden, wenn man bei ein paar Szenarien weitere funktionen aufrufen will oder eben nicht…

Hmja… ich denke das wars erst mal :wink:
Danke schon mal

Macht es einen Unterschied ob man mit Funktionen arbeitet, die
in einer separaten Datei includiert werden oder ob man doch
lieber die Funktionen in die einzelnen Scripte stecken sollte
und gefahr laufen dass man mehrer Funktionen doppelt
korrigieren muss…

Wenn du deine Funktionen in die einzelnen Dateien steckst kannst du’s auch gleich lassen, im Sinne der Modularität totaler Unsinn und so ein kleines include einer Funktionsbibliothek kostet nunmal fast garnichts. Und du willst doch auch nicht doppelt korrigieren…

Etwas anderes sind die mysql-abfragen (auch wenns nur halb
hierher gehört). Macht es Sinn einmal ein "select * " zu
wählen und dann die jeweilige Variable per global-funktion in
die jeweils nötigen Funktionen mit zu übernehmen? Oder ist es
klüger jedesmal neue selects zu machen und nur das aus der
Datenbank zu holen, was man auch braucht?

Was genau bitte ?! Generell sollte man _nie_ ein SELECT * machen, das ist langsam und du brauchst in den meisten Fällen eh nicht alle Felder. Ich versteh nicht ganz was du willst, per global variablen in Funktionen von aussen benutzen ? Bedingt ok, solange es Konstanten, ein DB-Link oder sowas ist, den Rest aber bitte schön der Funktion übergeben… Sonst verfehlst du irgendwie ein wenig den Sinn einer Funktion. Und sagt dir das Stichwort Namensräume was ?

Zuletzt noch: Macht es einen Unterschied ob ich die
verschiedenen Funktionen per „switch“ anweise oder ein if
($action == „value“) funktion(); verwende? Schliesslich kann
es mitunter durchaus praktischer sein die zweite Methode zu
verwenden, wenn man bei ein paar Szenarien weitere funktionen
aufrufen will oder eben nicht…

Das ist reine Kosmetik, bzw. ein switch macht halt bei mehr als 2 möglichen Werten Sinn, denn du willst ja keine 10fach verschachtelten If’s haben oder ?

Das einzige was bei deinen Fragen in Richtung Performance geht ist die MySQL Sache, dort kann man ganz schön was rausholen, Queries optimieren, umständliche Joins vermeiden, etc. Manchmal ist es schneller 5 kleine Queries zu machen als einen grossen. Aber sowas kann man dann ja Messen…

Sorry, Lars :smile:

Wenn du deine Funktionen in die einzelnen Dateien steckst
kannst du’s auch gleich lassen, im Sinne der Modularität
totaler Unsinn und so ein kleines include einer
Funktionsbibliothek kostet nunmal fast garnichts. Und du
willst doch auch nicht doppelt korrigieren…

Hatte ich eben auch nicht vor :wink:
Es war mir eben nur nicht sicher ob es etwas ausmacht, wenn ich jedesmal ein 20k file includiere, von dem vielleicht 20 Zeilen Code auch ausgeführt werden :wink:

Etwas anderes sind die mysql-abfragen (auch wenns nur halb
hierher gehört). Macht es Sinn einmal ein "select * " zu
wählen und dann die jeweilige Variable per global-funktion in
die jeweils nötigen Funktionen mit zu übernehmen? Oder ist es
klüger jedesmal neue selects zu machen und nur das aus der
Datenbank zu holen, was man auch braucht?

Was genau bitte ?! Generell sollte man _nie_ ein SELECT *
machen, das ist langsam und du brauchst in den meisten Fällen
eh nicht alle Felder. Ich versteh nicht ganz was du willst,
per global variablen in Funktionen von aussen benutzen ?
Bedingt ok, solange es Konstanten, ein DB-Link oder sowas ist,
den Rest aber bitte schön der Funktion übergeben… Sonst
verfehlst du irgendwie ein wenig den Sinn einer Funktion. Und
sagt dir das Stichwort Namensräume was ?

Naja… Ich nehm jetzt hier mal das krasseste Beispiel, das ich bei mir hatte… Eine Tabelle mit ca 40 Spalten und mehreren Zeilen, wobei jede Zeile ein User darstellt. Nach dem Login habe ich in der Variable $user die kompletten Daten des Users eingelesen (ausser sie standen in anderen Tabellen). Diese $user-Variable habe ich dann in den Funktionen includiert, um mir weitere Selects zu sparen. Aber ich hatte eben auch kein so gutes Gefühl dabei… Nur macht es denke ich die Seiten ein wenig sicherer, weil eben bei jedem Seitenaufruf alle Daten eingelesen werden und nicht irgendwie per post-variable reingedrückt werden können…

Das ist reine Kosmetik, bzw. ein switch macht halt bei mehr
als 2 möglichen Werten Sinn, denn du willst ja keine 10fach
verschachtelten If’s haben oder ?

gut… aber teilweise hab ich dennoch verschachtelte if-Anweisungen, weil ich zeitweise die gleichen Funktionen für unterschiedliche Ausführungen verwende (ein Beipiel war ein insert-Formular, das auch als edit-Formular verwendet wurde…)

Das einzige was bei deinen Fragen in Richtung Performance geht
ist die MySQL Sache, dort kann man ganz schön was rausholen,
Queries optimieren, umständliche Joins vermeiden, etc.
Manchmal ist es schneller 5 kleine Queries zu machen als einen
grossen. Aber sowas kann man dann ja Messen…

Um eins nochmal aufzugreifen: Mit Namensräumen kann ich nicht sehr viel anfangen… leider…
Wegen dem mysql bin ich aber immernoch unentschlossen, weil ich ja wirklich immer nur eine Zeile aus der Datenbank hole und keine richtig grossen Bereiche… Und die Daten die ich bei der einen Funktion nicht brauche brauche ich dann wieder bei der anderen, so dass ich je nach aufgerufenem switch doch wieder alle Daten brauche…

Wie wärs dann mit Sessions ? Dann holst du einmal alle Userdaten aus der DB und schleifst sie in der Session mit.

Zu Namenräumen/Kapselung
Was zum lesen: http://www.dclp-faq.de/q/q-php-variablen.html

Schaffst du schon :smile:
Lars

Wenn du deine Funktionen in die einzelnen Dateien steckst
kannst du’s auch gleich lassen, im Sinne der Modularität
totaler Unsinn und so ein kleines include einer
Funktionsbibliothek kostet nunmal fast garnichts. Und du
willst doch auch nicht doppelt korrigieren…

Hatte ich eben auch nicht vor :wink:
Es war mir eben nur nicht sicher ob es etwas ausmacht, wenn
ich jedesmal ein 20k file includiere, von dem vielleicht 20
Zeilen Code auch ausgeführt werden :wink:

Da handelt es sich um ein paar Millisekunden die nicht wirklich ins Gewicht fallen. Denn letztenendes liest Du lediglich Text ein. Vergleich es mal mit CSS und HTML. Wieviel Sinn macht es, jede CSS-Anweisung, mal abgesehen von den mögl. Fehlerquellen, 100 Mal einzugeben?

Etwas anderes sind die mysql-abfragen (auch wenns nur halb
hierher gehört). Macht es Sinn einmal ein "select * " zu
wählen und dann die jeweilige Variable per global-funktion in
die jeweils nötigen Funktionen mit zu übernehmen? Oder ist es
klüger jedesmal neue selects zu machen und nur das aus der
Datenbank zu holen, was man auch braucht?

Was genau bitte ?! Generell sollte man _nie_ ein SELECT *
machen, das ist langsam und du brauchst in den meisten Fällen
eh nicht alle Felder. Ich versteh nicht ganz was du willst,
per global variablen in Funktionen von aussen benutzen ?
Bedingt ok, solange es Konstanten, ein DB-Link oder sowas ist,
den Rest aber bitte schön der Funktion übergeben… Sonst
verfehlst du irgendwie ein wenig den Sinn einer Funktion. Und
sagt dir das Stichwort Namensräume was ?

Naja… Ich nehm jetzt hier mal das krasseste Beispiel, das
ich bei mir hatte… Eine Tabelle mit ca 40 Spalten

Das ist sicherlich ein Krasses Beispiel. Bei 40 Spalten ist bei der Tabellenplanung wohl etwas schief gelaufen. So viele Spalten in eine Tabelle zu packen ist schier Wahnsinn, im Hinblick auf Fehlerquellen Doppelte Datensätze usw. Du solltest Dir überlegen, sich wiedeholende Daten in extra Tabellen zu packen und bei Bedarf explizit darauf zuzugreifen. Bringt bei der SQL-Abfrage einiges an Performenceentlastung.

und
mehreren Zeilen, wobei jede Zeile ein User darstellt. Nach dem
Login habe ich in der Variable $user die kompletten Daten des
Users eingelesen (ausser sie standen in anderen Tabellen).
Diese $user-Variable habe ich dann in den Funktionen
includiert, um mir weitere Selects zu sparen. Aber ich hatte
eben auch kein so gutes Gefühl dabei… Nur macht es denke ich
die Seiten ein wenig sicherer, weil eben bei jedem
Seitenaufruf alle Daten eingelesen werden und nicht irgendwie
per post-variable reingedrückt werden können…

Das ist reine Kosmetik, bzw. ein switch macht halt bei mehr
als 2 möglichen Werten Sinn, denn du willst ja keine 10fach
verschachtelten If’s haben oder ?

gut… aber teilweise hab ich dennoch verschachtelte
if-Anweisungen, weil ich zeitweise die gleichen Funktionen für
unterschiedliche Ausführungen verwende (ein Beipiel war ein
insert-Formular, das auch als edit-Formular verwendet
wurde…)

Das einzige was bei deinen Fragen in Richtung Performance geht
ist die MySQL Sache, dort kann man ganz schön was rausholen,
Queries optimieren, umständliche Joins vermeiden, etc.
Manchmal ist es schneller 5 kleine Queries zu machen als einen
grossen. Aber sowas kann man dann ja Messen…

Um eins nochmal aufzugreifen: Mit Namensräumen kann ich nicht
sehr viel anfangen… leider…
Wegen dem mysql bin ich aber immernoch unentschlossen, weil
ich ja wirklich immer nur eine Zeile aus der Datenbank hole
und keine richtig grossen Bereiche… Und die Daten die ich
bei der einen Funktion nicht brauche brauche ich dann wieder
bei der anderen, so dass ich je nach aufgerufenem switch doch
wieder alle Daten brauche…

Grundsätzlich besteht halt die Frage, wieviel Sinn macht es auf Performance zu Programmieren? Bei täglich, sagen wir mal 500 Besuchern auf einer Page, von denen vielleicht 10-15 gleichzeitig Online sind, sicherlich nicht viel. Denn da sind die „Einbusen“ dermaßen gering, dass sie zu vernachlässigen sind. Sollten es jedoch mehrere hundert User gleichzeitig sein, wäre es sicherlich sehr sinnvoll an Performance zu denken. Aber dies nur mal am Rande.

Gruß,

Michael