Performante Entwicklung in PHP.

  • Guten Tag meine lieben Mitbürger,

    ich schreibe aktuelle an einem neuem CMS und habe mich gerade wieder furchtbar über die
    Entwickler des ReCMS aufgeregt. Als ich den HTML-Code des Clientens klauen wollte bin ich
    über sehr performante Lösungen gestolpert.
    Damit die Leute, die wirklich etwas lernen wollen, etwas lernen können schreibe ich hier mal
    ein kleines Tutorial wie man die Geschwindigkeit einiger Seiten sehr einfach optimieren kann.


    Anführungszeichen oder Apostroph ?

    Etwas was ich fast täglich sehe sind lustig definierte Strings, welche dem Webserver mehr
    Arbeit machen als nur benötigt. Besonders schön sieht man das an Deklarationen wie der
    Folgenden:

    Code
    $test  = "";

    So etwas ist totaler Unsinn. Der Webserver wird versuchen bei der Verarbeitung dieser
    Deklaration z.B. Strings in diesem String zu suchen und zu ersetzen. Richtig wäre es hier
    mit einem Hochkomma zu arbeiten.

    Code
    $test  = '';

    Ein Benchmark zeigt auf meinem PC (MacBook Pro 2011 - getestet in: Coderunner
    - 10000 definitionen) doch recht deutliche Differenzen die Zeit betreffend:

    Anführungszeichen:
    LOWEST: 0.087432861328125 Millisekunden
    HIGHEST: 0.094133853912354 Millisekunden

    Apostroph:
    LOWEST: 0.00098109245300293 Millisekunden
    HIGHEST: 0.001060962677002 Millisekunden

    Wenn man das mal bei einer gut besuchen Webseite ausprobiert wird die CPU stark entlastet,
    was sich auch in der Geschwindigkeit widerspiegelt.


    SELECT * FROM schlecht

    Jetzt kommen wir zu meinem kleinen "Aufreger" des heutigen Tages:

    Code
    $client_port = mysql_fetch_assoc($client_port = mysql_query("SELECT * FROM cms_settings WHERE variable = 'client_port'"));
    $client_mus = mysql_fetch_assoc($client_mus = mysql_query("SELECT * FROM cms_settings WHERE variable = 'client_mus'"));
    $client_ip = mysql_fetch_assoc($client_ip = mysql_query("SELECT * FROM cms_settings WHERE variable = 'client_ip'"));
    $client_variables = mysql_fetch_assoc($client_variables = mysql_query("SELECT * FROM cms_settings WHERE variable = 'client_variables'"));
    $client_variables_night = mysql_fetch_assoc($client_variables_night = mysql_query("SELECT * FROM cms_settings WHERE variable = 'client_variables_night'"));
    $client_texts = mysql_fetch_assoc($client_texts = mysql_query("SELECT * FROM cms_settings WHERE variable = 'client_texts'"));
    $client_swf_path = mysql_fetch_assoc($client_swf_path = mysql_query("SELECT * FROM cms_settings WHERE variable = 'client_swf_path'"));
    $client_habbo_swf = mysql_fetch_assoc($client_habbo_swf = mysql_query("SELECT * FROM cms_settings WHERE variable = 'client_habbo_swf'"));
    $client_limit = mysql_fetch_assoc($client_limit = mysql_query("SELECT * FROM cms_settings WHERE variable = 'cms_clientlimit'"));

    Gut. Dieser Code erledigt seine Aufgabe... Aber wusstet ihr dass hier sogar 3 Fehler gemacht
    wurden? Nein?

    Erstens das Anfürungszeichen. Aber wieso soll man mehrere Querys ausführen obwohl diese 9 Querys
    in einen passen? Ich möchte jetzt natürlich nicht am Können von Diwo und/oder MoneyMaker zweifeln,
    aber ich kenne eine Methode womit dies bis zu 90% schneller geht:

    Code
    $startzeit = microtime(false);
    	$query = mysql_query('SELECT variable, value FROM cms_settings');
    	while($row = mysql_fetch_array($query)) {
    		$settings[$row['variable']] = $row['value'];
    	}	
    	print_r($settings);
    	echo "Daten geholt in ".(microtime(false) - $startzeit) . " Mikrosekunden";

    Ich hole mir die Daten einfach in einem Query. Und das beste ist, dass hier zwar doppelt so viele Daten
    geholt werden (18 statt nur 9) aber die Zeit immer noch deutlich niedriger ist: 0.026737 Mikrosekunden.
    Die andere Lösung (von Diwo oder MoneyMaker) benötigt dabei 0.141814 Mikrosekunden. Wenn man
    dazu rechnet dass dort nur die Hälfte der Daten geholt wurden sieht man dass meine Lösung nur
    9% der Zeit benötigt hat. Bei einem Webserver fallen diese Werte natürlich um einiges höher aus,
    ihr müsst nun nicht Flamen weil ich hier wegen Millisekunden rum meckere.

    Ausserdem sind die Server des Habbo.mn relativ gut optimiert. Wir z.B. haben die komplette
    Datenbank in unseren RAM gelesen. Dies verringert die Festplattenzugriffe und ist um einiges
    schneller.

    Noch mehr Geschwindigkeit erreiche ich in dem Skript oben durch den Array. Dazu aber beim
    nächsten Mal mehr.


    <!-- Fortsetzung folgt !-->

    3 Mal editiert, zuletzt von anonymous (5. Juni 2012 um 14:40)

  • Ja hab ich auch schon davon gehört,
    finde es echt super von dir das du hier einigen helfen willst.
    Wie gesagt, Diwo schreibt seine Scripts etc. echt crappy.

    Mit freundlichen Grüßen,
    Breakdance.

  • Die meisten dir hier jetzt geniales Tutorial schreiben etc. wissen doch nicht mal was Sache ist. Naja, ich finde, alles unter 1 Millisekunde ist perfekt, ein Mensch merkt doch wohl nicht wirklich ob es 1 Millisekunde oder 0.8 Millisekunden waren. Immerhin, das mit den SELECT * ... regt mich genauso auf, naja, ich habe das genauso damals gemacht, aber ich weiß was Sache ist und wie es sich gehört, sie könnten sich genauso die eine Variable bzw den Wert der Spalte holen wie du es erklärt hast.

    Aber ehrlich gesagt, ich glaube das bringt hier gar nichts, dieses Tutorial. Der Großteil wird es sich nicht mal durch lesen bzw verstehen. Naja, was solls, die meisten wollen nur Angeben (nicht du, die die Zustimmen und keine Ahnung haben). Immerhin, ich stimme zwar zu, aber ich finde das mit ' ' und " " relativ, unnötig. Ich nutze '' nur bei Chars, und "" nur bei Strings, bin es mir von C# angewohnt, aber naja, einen großen Unterschied habe ich noch nie gemerkt. Außerdem, ich finde in PHP allgemein fast alles Dumm, wieso sie ein Dollar Zeichen ($LOL) für JEDE Art von Variable nutzen, also ein Objekt, eine Variable für jeden Bullshit. In C# und Java ist es schön aufgeteilt, gibt zwar auch Objekte, aber ein richtiger Programmierer nutzt schon die richtige Zuordnung, je nachdem, es gibt Unterschiedliche Programmierer.

    Ich hoffe für PHP sie ändern das mal endlich mit den Dollar Zeichen das man genauso string, int, char, boolean etc. nutzen kann, wäre VIEL übersichtlicher und ich glaube der Webserver könnte es auch viel schneller und besser lesen, bevor er den Bullshit identifizieren muss. Aber naja, jeder seiner Sache.

    Finde das Tutorial etwas Streng erklärt, aber sollte für richtige Programmierer leicht verständlich sein. Werde jetzt selber anstatt " " immer ein Apostroph nutzen, auch wenn ich es nicht gewohnt bin, hoffentlich gewöhne ich es mir nicht ab in C#, wäre relativ kacke.

    Naja, ich hab keine Lust jetzt wieder einen fetten Roman zu schreiben, hoffentlich ließt sich das jemand durch. :-].

    # Edit

    Und für die Leute, die jetzt Hoffnung suchen, womit man ihren Client schneller machen kann, macht euch keinen Kopf, solange der Client schwarz wird und BEGINNT zu laden, dann hängt es NICHT mehr von PHP ab, dann hängt es von den SWF's ab und der Verbindung zu deinem Server oder auch Hamachi- Netzwerk bzw deinem Modem und deiner Anbindung und deinem Computer, wie schnell alles ladet und wie schnell alles Funktioniert. Aber naja ;-P Anonymous wollte euch eigentlich im Großteil nur zeigen, wie Dumm ihr bzw die ReCMS Entwickler sind, ich glaube Diwo hat das entwickelt? Bin gespannt wie sein kompelttes CMS von innen ausschaut. Das hat ja nicht mal Klassen etc. was mich in PHP richtig aufregt, in C# ist es ein richtiges muss, für jeden Scheiß, ist besser und übersichtlicher. Ich war schon immer gegen ReCMS und werde es auch bleiben, habe ja nun mein eigenes CMS, zwar nicht das beste, habe ja in der Zeit vieles neues dazu gelernt, aber naja :-D.

  • Wobei ich vergessen habe zu erwähnen dass das Verwenden von Apostrophen sich nur loht, wenn z.B, kein String durch einen weiteren definiert wird.

    $ok = 'schneller';
    $ok = "In diesen Fall ".$ok;

    Wollte jetzt off gehen und werde es später hinzu editieren.

    -------------------------

    JNike:
    Ich bevorzuge Java vor PHP - teilweise auch aus den Gründen die du genannt hast.

  • Ich verstehe relativ wenig von php, aber ich komm schon noch mit was du & aapo meinen.
    Bin eigentlich auch gegen HoloCMS bzw. ReCMS.
    Diwo bzw. MoneyMaker ging es bei der ganzen Sache ja nur ums Geld, deswegen sollte alles
    schnell gehen, egal wie schlampig die Codes sind. ^^

    - Breakdance.

  • Naja ich muss nur noch Javascript lernen, bin aber wirklich viel zu Faul eine Sprache zu lernen die anderen Sprachen die ich bereits beherrsche ähnelt, aber naja, ich will die coolen Effekte wenigstens noch lernen. (Moving, Textchanging without reloading, Menüs etc.)

  • Naja ich muss nur noch Javascript lernen, bin aber wirklich viel zu Faul eine Sprache zu lernen die anderen Sprachen die ich bereits beherrsche ähnelt, aber naja, ich will die coolen Effekte wenigstens noch lernen. (Moving, Textchanging without reloading, Menüs etc.)

    Hab mich zuerst auch vor Javascript gescheut, wenn du aber einfach mal einen
    Tag damit rumspielst - ohne irgendein Framework wie z.B. jQuery - wirst du es
    lieben.

  • Kann JNike nur zustimmen.
    Dieses Tutorial dient vielleicht nur bei Projekten, bei dem wirklich Millionen von Daten (vergleichbar nur in einer Firma / Betrieb) geholt bzw. geschrieben werden müssen.
    Es bringt hier im Retro Geschehen rein gar nichts die Daten nicht mit SELECT * zu holen, denn man merkt es nicht ;)

    Also klar, es ist schöner und besser programmiert, aber hier bringt das nicht viel.

    so far
    Yannici

  • Javascripts am Schluss der Seite schreiben bringen auch schnelligkeit ^^

    Aber mal ehrlich, wem kümmerst, ob es um ~0,001 Millisekunden schneller oder langsamer ladet? Und ich mach meine SQL Querys immer mit mysql_query(""); also mit " und ich versteh nicht, was daran falsch sein soll. Ich sche!ss auf 0,001 MS. Schnelligkeit :P

  • Javascripts am Schluss der Seite schreiben bringen auch schnelligkeit ^^

    Aber mal ehrlich, wem kümmerst, ob es um ~0,001 Millisekunden schneller oder langsamer ladet? Und ich mach meine SQL Querys immer mit mysql_query(""); also mit " und ich versteh nicht, was daran falsch sein soll. Ich sche!ss auf 0,001 MS. Schnelligkeit :P

    Kleines Beispiel.
    Ob man auf einer Autobahn 3 oder 4 Fahrbahnen hat ist bei normalen Verkehr irrelevant.
    Beispiels weiße beim Feierabendverkehr bringt die zusätzliche Fahrbahn immense Entlastung.

  • Javascripts am Schluss der Seite schreiben bringen auch schnelligkeit ^^

    Aber mal ehrlich, wem kümmerst, ob es um ~0,001 Millisekunden schneller oder langsamer ladet? Und ich mach meine SQL Querys immer mit mysql_query(""); also mit " und ich versteh nicht, was daran falsch sein soll. Ich sche!ss auf 0,001 MS. Schnelligkeit :P

    Schneller ist schneller. Und der User hat sicherlich dann auch ein erfreulicheres Gesicht, er möchte ja schnell an's Werk. ;)

    Freundliche Grüße, Kazenka-San

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!