PHP/Apache - Performancefrage

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • PHP/Apache - Performancefrage

    Was ist schneller?

    Habe folgende Szenario:



    1: Es wird eine Grafik dynamisch mit PHP erzeugt. Dabei wir folgendes getan:

    Hintergrund wird geladen, Buchstaben (ca. 20) werden per imagettf ins Bild geschrieben


    2: Es wird eine Grafik dynamisch mit PHP erzeugt. Dabei wir folgendes getan:

    Hintergrund wird geladen, Buchstaben (ca. 20) werden per imagesetpixel in das Bild gemalt. Bei 20 Buchstaben sind dies 200 Aufrufe von imagesetpixel



    3: Es wird eine Grafik dynamisch mit PHP erzeugt. Dabei wir folgendes getan:

    Hintergrund wird geladen, ca. 20 Buchstaben (gif-Grafiken, 2farbig, transparenter Hintergrund, pro Buchstabe ca. 50 Bytes) per PHP in das Bild eingefügt und über den Hintergrund positioniert.


    4. Die 20 Buchstaben (im Verzeichnis abgespeichert) werden per Div über den Hintergrund gelegt.
    Der Browser lädt ca. 21 Grafiken inklusive dem Hintergrund.





    Was schont den Server am stärksten?

    hat ein Server eher mit sehr vielen Anfragen (Variante 4) Probleme?

    fällt es PHP schwer mehrere Grafiken zusammen zu basteln (Variante 3)?

    fällt es PHP schwer sehr viele einzelne Punkte in ein Bild zu zeichen? (Variante 2)

    Ist das rendern von TTF-Fonts extrem serverlastig? (Variante 1)




    Ich gehe davon aus, dass das Rendern von TTF-Fonts am serverlastigsten ist, die Punkte malen vermutlich etwas serverfreundlicher.

    Wie performant das Übereinanderlegen der Grafiken in PHP selbst ist kann ich nicht einschätzen, genausowenig was es für einen Server bedeutet 20 mal so viele Anfragen wie sonst zu verarbeiten.

  • #2
    Und können wir auch alle nicht, weil das von Server zu Server unglaublich schwanken kann.
    Mach einen Stresstest.

    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
    Wie man Fragen richtig stellt

    Kommentar


    • #3
      Ich würde zu Version 1 mit einem Cache erzeugter Bilder tendieren.

      Kommentar


      • #4
        Ich halte definitiv die erste Variante für am ehesten performant.

        Die zweite scheidet für mich aus dem Grund aus, weil ich hier mit PHP eine Logik schreibe, die Buchstaben ins Bild zeichnet. Ich habe aber doch die GDLib, die bereits eine solche Funktion zur Verfügung stellt. Und zwar in C geschrieben.

        Die dritte Möglichkeit erscheint mir die ziemlich blödeste Möglichkeit zu sein

        Die vierte Möglichkeiten mag den Server evtl. dahingehend entlasten, nicht rumrechnen zu müssen, man muss aber dafür eine handvoll Anfragen mehr bearbeiten. Das geht zwar von Serverseite aus recht flott, sieht im Seitenaufbau dann allerdings wieder Banane aus. Zumal so eine Sache a) ohne Divs gelöst werdne kann und b) trotzdem dicke Suppe gibt.
        [FONT="Helvetica"]twitter.com/unset[/FONT]

        Shitstorm Podcast – Wöchentliches Auskotzen

        Kommentar


        • #5
          hmm mist variante1 ist die aktuell genutzte die langsam an Ihre Grenzen stößt.

          Warum scheidet denn variante 2 aus? Die Funktion imagesetpixel nutzt doch auch die GD-Lib die in C programmiert ist?

          der Rest von deinem Post überzeugt wirklich, Variante 3 macht wirklich keinen Sinn und Variante 4 ist nicht gerade die schönste.

          Kommentar


          • #6
            Original geschrieben von zapate
            Warum scheidet denn variante 2 aus? Die Funktion imagesetpixel nutzt doch auch die GD-Lib die in C programmiert ist?
            Sicher, die PHP-Funktion zum setzen eines Pixels greift auch wieder auf die GDLib zu (die in C geschrieben ist). Allerdings schreibst du die Logik, wo die einzelnen Pixel zu setzen sind ja in PHP. Was aus dem Grund sinnlos ist, da die GDLib eine Funktion zum Zeichnen von Buchstaben ja bereits mitbringt. Zumal du mit dem Default-Font ja locker hinkommst (du willst ja offensichtlich mehr als rudimentäre gezeichnete Zeichen nutzen).

            Aber denk doch evtl. mal über das chachen von bereits generierten Bildern nach. Evtl. kannst du ja auch den konkreten Einsatzzweck nennen, vielleicht fällt den Leuten hier eine (oder mehr) weitere Variante ein.
            [FONT="Helvetica"]twitter.com/unset[/FONT]

            Shitstorm Podcast – Wöchentliches Auskotzen

            Kommentar


            • #7
              Es wird bereits gecached:

              PHP-Code:
                    $filetime=filemtime('temp/'.$id.'.png')+60*20;
                    if(!
              $filetime OR $filetime<=time() )
                       {

                          
              header("Content-type: image/png");

                          
              $im    imagecreatefrompng('images/'.$_GET['stil'].'.png');
                          
              $color imagecolorallocate($im255255255);

                          if(
              $_GET['stil']=="88_15")
                             {

                                
              $font 'font.ttf';

                                
              $color imagecolorallocate($im000);
                                
              imagettftext($im60810$color$font"VISITS: ".$data['gesamt']);

                             }
                          else
                             {
                                if(
              $_GET['stil']=='white' OR $_GET['stil']=='yellow' OR $_GET['stil']=='lightgrey')
                                   {
                                      
              $color imagecolorallocate($im000);
                                   }
                                
              $font 'font.ttf';

                                
              imagettftext($im604418$color$font$data['heute']);
                                
              imagettftext($im604427$color$font$data['gestern']);
                                
              imagettftext($im604436$color$font$data['gesamt']);
                                
              imagettftext($im604445$color$font$online['count']);

                             }



                          
              imagepng($im);
                          
              imagepng($im,'temp/'.$id.'.png');
                          
              imagedestroy($im);
                       }

                    else
                       {
                          
              header('Location: '.'temp/'.$id.'.png');
                       } 

              Kommentar


              • #8
                Wenn ich das richtig sehe, werden die generierten Bilder aber "nur" für 20 zwischengespeichert. Ich nehme doch mal an, dass du die Daten aus einer Datenbank holst. So kannst du doch auch ermitteln, ob seit der letzten generierung der Grafik eine Änderung stattgefunden hat. Und nur in dem Fall würde ich eine Neue zusammenschustern.

                Und: Sehe ich das auch richtig, dass du prüfst, ob Der Zeitstempel der Datei plus 20 Minuten KLEINER als die aktuelle Zeit ist?
                [FONT="Helvetica"]twitter.com/unset[/FONT]

                Shitstorm Podcast – Wöchentliches Auskotzen

                Kommentar


                • #9
                  ja zeitstempel + 20 minuten < aktuelle zeit.


                  zeitstempel: 12:46 uhr + 20 minuten

                  13:06 <= 12:46 FALSE

                  in dem fall redirect zum gecachtem bild

                  Kommentar


                  • #10
                    Haha, wusste ich doch, dass ich nen Denkfehler gemacht hab. Sorry, sitz hier grad selbst vor nem kniffligen Problemchen
                    [FONT="Helvetica"]twitter.com/unset[/FONT]

                    Shitstorm Podcast – Wöchentliches Auskotzen

                    Kommentar


                    • #11
                      hmm mist variante1 ist die aktuell genutzte die langsam an Ihre Grenzen stößt.
                      Warum das? Was ist mit dem Skript? Alle 20 Minuten ein Bildchen malen sollte absolut kein Problem darstellen!

                      Kommentar


                      • #12
                        es gibt mehrere user, für jeden user werden alle 20 minuten ein bild erzeugt.

                        Der Ordner temp enthält gegen 20 uhr ca. 6000 Bilder. Vielleicht bremst das den Server?

                        Kommentar


                        • #13
                          Auf jeden Fall wirds problematisch, wenn die Anzahl der User steigt.

                          Müssen es denn unbedingt Bilder sein? Was machst du da eigentlich?

                          Kommentar


                          • #14
                            sieht man das nicht? ich biete einen counterservice an :-)

                            Kommentar


                            • #15
                              Original geschrieben von onemorenerd
                              Müssen es denn unbedingt Bilder sein?
                              Die Frage stelle ich mir auch, weil ja offensichtlich auch die Option, die Chars als einzelne Grafiken vor den Hintergrund zu klatschen in Betracht gezogen wurde.

                              Wie dem auch sei. Ich denke, man kann durch einen simplen Vergleich zu 100% feststellen, ob die Daten im zwischengespeicherten Bild noch aktuell sind oder nicht, und dahingehend entweder die zwischengespeicherte Grafik ausgeben oder eine neue generieren.
                              [FONT="Helvetica"]twitter.com/unset[/FONT]

                              Shitstorm Podcast – Wöchentliches Auskotzen

                              Kommentar

                              Lädt...
                              X