Ankündigung

Einklappen
Keine Ankündigung bisher.

PhpTemplatesystem mit Include und PHP Templatefunktionen

Einklappen

Neue Werbung 2019

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

  • PhpTemplatesystem mit Include und PHP Templatefunktionen

    Ich experimentiere mit PHP als Templatesprache herum und bin da auf ein Problem gestoßen das ich nicht lösen kann.

    Das Beispiel hier macht programmiertechnisch weniger Sinn es geht nur darum das Problem zu beschreiben:

    Hier werden ca 5000 Dateien per Include eingebunden, irgnorieren wir mal dass aleine dass schon auf die Performance gehen würde, aber wie läuft das mit den Includedateien?

    Ich würde dieses Ausgabesystem gerne in einem Daemon laufen lassen, sprich bei jeder Anfrage würden ein paar Templates includet werden.

    Sprich nach 1000 Besuchern habe ich dann ca 10000 mal includiert ohne dass das Script beendet wurde, also irgendetwas entfernt wurde.

    Weiß jemand wie PHP das mit dem Speichermanagement und den Includes macht?
    Ich hab ja keine neuen Funktionen oder sonstiges in den Templates, nur Ausgaben.

    Explodiert mir so irgendwann der Speicher, oder ist es unbedenklich so lange ich nicht tonneweise von Objekten und Klassendefinitionen nachlade.

    Hier ein Beispielabschnitt zum befüllen des Templates zum demonstrieren des erwarteten Effektes:
    PHP-Code:
    <?php
    reset
    ($DatabaseResult); // 5000 Einträge
    while ( list( $Key $Val ) = each($DatabaseResult) ):
      include 
    "./template/UserRow.tpl";
    endwhile;
    ?>
    Die Templatedatei
    PHP-Code:
    <tr>
      <td><?php echo $Val["name"?></td>
      <td><?php echo $Val["nachname"?></td>
      <td><?php echo $Val["login"?></td>
      <td><?php echo $Val["alter"?></td>
    </tr>
    Gruß Sono

  • #2
    Hallo Karlsruher,
    mir ist nicht ganz klar, was du in diesem Zusammenhang mit Daemon meinst.

    Vielleicht umschreibst du mal noch gröber, was du bei deinem Projekt vor hast.
    Dass dein Server irgendwann in die Knie geht, wenn die Zahl der Besucher steigt ist ja klar, wann ist eigentlich egal, denn das kann ja schon ziemlich schnell passieren, bei immerhin 5000 Dateien.

    Auch wenns mir danach klingt, dass 5000 Dateien für kein Projekt der Welt Sinn machen. Vielleicht auf den ersten Blick, aber allein schon wegen der Performance muss man sich etwas anderes überlegen.

    Caching ist hier wohl Pflicht.

    Edit: Ah OK jetzt verstehe ich deinen include. Das ist meiner Meinung nach auch das Problem bei der Verwendung von Template-Systemen: Man übertreibt es irgendwann mit der "Normalisierung" der Templates.

    Ob das jetzt sonderlich schnell oder langsam ist, weiß ich nicht mal. Hast du es denn mal getestet? Außerdem gibts für Apache ja diverse Belastungs-Tools, die Anfragen senden um herauszufinden, wann der Server in die Knie geht bzw. wo sein Flaschenhals ist.

    Kommentar


    • #3
      Ich lass grad nen Lasttest laufen.

      Daemon heiß, dass ein phpdaemon im cli läuft und Html Seiten auf Anfrage generiert die sich dann ein SocketClient aus dem Apachemodul abholt.

      Das sind im Moment mehr Spielereihen, und Entwürfe hier geht es erst mal gar nicht um Projektgröße sondern um eine Designentscheidung im Templatesystem.

      Entweder ich lade die Templates mit file_get_contents und bau mir ne eigene Templatesyntax die ich dann mit regex verwurschtel, bzw das habe ich im Moment so.

      Oder ich verwende PHP als Templatesprache wovon ich mir etwas mehr performance verspreche. Nun wenn aber die PHP Templateversion in diesem CLI Daemon läuft würde jede Anfrage an den Daemon ein paar Templates Includieren und dann die Ausgabe zurück per socket an den Apache Client schicken.

      Damit hätte ich also pro Aufruf ca 10 Dateien mehr Includiert. Im Moment sieht der Test so aus, als ob ich das vergessen sollte.

      Ich lass gerade 5.000.000 Templates Includieren und jag die Ausgabe über Netz. Die Datendurchsatzrate ist von 500Kb/s auf nun 10Kb/s abgefallen.

      Aber Interessanterweise bleibt der Speicher verbraucht auf dem Server Konstant, die App wird nur immer langsamer.

      Gruß Sono

      Kommentar


      • #4
        Ich lass gerade 5.000.000 Templates Includieren
        Arg, mich würde das Projekt mal interessieren, wo es solche Mengen benötigt.

        Ich lass grad nen Lasttest laufen.
        Wie sieht der denn überhaupt aus ?

        Da meine Fragen eher OT sind, kannst du auch via PN antworten.

        Mal abgesehen von Besucherzahlen, kommen auch noch viele Suchmaschinen hinzu, und meist liegt hier die größte Belastung, wenn z.B. nur Google im Sekundentakt deine Seiten durchsucht.

        Kommentar


        • #5
          Die Alte Syntax läuft wesentlich schneller Konstant bei 6800Kb/s Output.
          Wobei man hier zurecht anmerken darf, dass dieser Code wohl nur mäßig als Benchmark geeigent ist.

          PHP-Code:
          <table>
          <?php
          set_time_limit
          (0);
          error_reportingE_ALL E_STRICT );

          $Val = array( "Otto",
                        
          "eckbert",
                        
          "Ollum",
                        
          "22" );

          $Replaces = array(  "<VAR:Nam />" ,
                              
          "<VAR:name />" ,
                              
          "<VAR:nachname />",
                              
          "<VAR:login />",
                              
          "<VAR:alter />"   );

          $Template =
          "<tr>
            <td><VAR:Nam /></td>
            <td><VAR:name /></td>
            <td><VAR:nachname /></td>
            <td><VAR:login /></td>
            <td><VAR:alter /></td>
          </tr>"
          ;

          for( 
          $Nam $Nam 3000000 ; ++$Nam ){
            
          $Rep array_merge( array($Nam), $Val );
            echo 
          str_replace$Replaces $Rep $Template );
          }
          ?>
          </table>
          Nun nochmal zu den Fragen, also das Projekt benötigt keine 5000 Dateien auf ein Schlag, nur da die App als Daemon laufen soll würde jeder bei dem Versuch ein Templatesystem mit PHP und Includes zu bauen der Daemon bei jedem Aufruf die Templates beim generieren der Seite Includieren. Daraus resultiert die irgendwann astronomische Anzahl von Includes.

          Wie schon oben erwähnt ist das allerdings keine Gute idee da die App nach 100.000 Includes bereits in den Knien ist und bei 200.000 Includes schon so gut wie klinisch Tot ist.

          Würde ich ne normale Webbapp schreiben wäre ein templatesystem mit PHP und includes allerdings schneller, da ist das Script ja auch nach einem Aufruf wieder Geschichte.

          Klarheiten beseitigt?

          Wobei das Caching und die Ausgabepufferung mit dem Includierten Templates auch etwas bescheiden war, weil sich plötzlich die View mit dem Logsystem in die Haare bekommen hat, aber das ist ne andere Geschichte.

          Kommentar


          • #6
            Was ein Daemon ist, weiß ich, danke

            Das eigentliche Problem ist doch aber eigentlich, dass du 5.000 Datensätze auf einmal anzeigen möchtest. Warum eigentlich? Falls du es doch machen willst, per Daemon oder ohne, dann generier dir das komplette Endergebnis eben als HTML-Datei, die du dann ohne Rechenleistung anzeigen kannst. Nur wird die eben wohl ziemlich groß.

            Musst dich eben fragen, welche Daten/Seiten werden sinnloser Weise mehrfach errechnet und wie kann ich das umgehen? Caching eben.

            Kommentar


            • #7
              Ich hätte diese Doofe Beispiel nicht bringen sollen.

              Bitte ignorier es. Ich habe ein Cachingsystem. Da liegt auch gar nicht das Problem.
              Ich habe ja auch bereits geschrieben, dass ich nur den Effekt mit den Beispiel verdeutlichen wollte.

              Ich habe, hatte ein Templatesystem(mit Cache), dieses Templatesystem funktioniert wunderbar so lange es nur im ApacheModul läuft, einmal aufgerufen wird, und dann das Script beendet wird.

              Wenn ich das jetzt aber 1zu1 in den Daemon übernehmen würde, dann käme früher oder später der Effekt mit den tausenden Include zum tragen, weil der Daemon eben nicht nach jedem Seitenaufruf beendet wird, aber trotzdem immer wieder templates includet um die Ausgabe zu generieren, ich muss es ja erst mal generieren bevor ichs cachen kann.

              Im Endeffekt isses aber egal, wie gesagt es funktioniert in der Art und Weise leider nicht so wie ich das gerne hätte, was aber irgendwie zu erwarten war.

              Danke für eure Hilfe.

              Gruß Sono

              Kommentar


              • #8
                Ich muss zugeben, mir ist nicht ganz klar, was du eigentlich von uns willst.

                Wenn ich das jetzt aber 1zu1 in den Daemon übernehmen würde, dann käme früher oder später der Effekt mit den tausenden Include zum tragen, weil der Daemon eben nicht nach jedem Seitenaufruf beendet wird, aber trotzdem immer wieder templates includet um die Ausgabe zu generieren, ich muss es ja erst mal generieren bevor ichs cachen kann.
                Wenn du den Prozess eben alles machen läßt und das auch noch die ganze Zeit, immer wieder, dann musst du dich ja nicht wundern, dass irgendwann Sense ist.

                Wie kommst du eigentlich auf die Idee mit dem Daemon? Sind deine Ausgaben so komplex, dass sie nicht on-the-fly erzeugt werden können?

                Kommentar


                • #9
                  Also am Anfang wollte ich nur wissen ob es Probleme geben könnte wegen der vielen Includes, oder ob php das egal ist weil ich ja keine zusätzliche Funktionalität einbinden.

                  Nach dem Benchmarks bin ich dann drauf gekommen, dass es nicht geht obwohl der Speicherverbrauch nicht angestiegen ist.

                  Damit war mein Problem eigentlich schon gelöst. ( Das hätte ich deutlicher zum Ausdruck bringen sollen, sorry ).

                  Der Rest war eigentlich nur noch, dass ich erklärt habe was ich eigentlich mache und wozu.

                  Den Daemon habe ich mir geschrieben ein wenig mit Server/Client Geschichten experimentieren zu können.

                  Das kann man in PHP wunderbar schnell umsetzten.

                  Gruß Sono

                  Kommentar

                  Lädt...
                  X