Ankündigung

Einklappen
Keine Ankündigung bisher.

Scrip bremst Ladezeiten aus

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

  • Scrip bremst Ladezeiten aus

    Guten tag,

    Ich betreibe eine kleine Gameserver- Community- Website und verwende als Plattform Wordpress.
    Als Game- Server- Status- Anzeige bediene ich mich einem kleinen Script das Separat als Widget ausgeführt wird. Das Script wird Insgesamt drei mal verwendet, das nun die Seite enorm ausbremst bis die api gelesen wurde.

    PHP-Code:
    <?php
    ini_set
    ('user_agent''PHP');
    $json file_get_contents("https://rust-servers.net/api/?object=servers&element=detail&key=IzhbRykrLsStpEK2Vcu9WfZRUC82uTm0CBY");
    $data json_decode($json);

    $json2 file_get_contents("https://rust-servers.net/api/?object=servers&element=voters&key=IzhbRykrLsStpEK2Vcu9WfZRUC82uTm0CBY&month=current&limit=1&format=json");
    $data2 json_decode($json2,true);
    $users=$data2['voters'];
    echo 
    '<table>';
    foreach (
    $users as $user){

    }
    echo 
    '</table>';

    echo 
    "";
    $online $data->is_online;
    if (
    $online =="1"){
        echo
    "

    <img src="
    http://www.projekt-endzeit.de/wp-content/uploads/2018/02/rust_icon2.png"height="42" width="42">    
    ".$data->version." <b>Uptime:</b>&nbsp;".$data->uptime."%<br />
        <
    b>Players:</b>&nbsp;".$data->players."/".$data->maxplayers."<br />
        <
    br />
        <
    u><b>Topvoter</b></u> <br />
        <
    tr><td>".$user['nickname']."</td><td>&nbsp;</td><td".$user['votes']." votes</td></tr><br /><br /> <a href="https://rust-servers.net/server/138044/vote" target="_blank" style="color:red">VOTE NOW</a> : <a href="steam://connect/24.134.39.77:52000" target="_blank" style="color:grey">JOIN SERVER</a>


        
    ";
    }else{
        echo"
    <img src="http://www.projekt-endzeit.de/wp-content/uploads/2018/02/red_shutdown.png" alt="Offline">";
    }

    ?>
    Das Script an sich, erfüllt jetzt den zweck wie ich mir das vorgestellt habe. Nur die Ladezeit ist jetzt ein Thema mit dem ich nicht mehr zurecht komme und erhoffe mir, hier, etwas Hilfe. Denn da hören einfach meine Kenntnisse sowie mein Verständnis fürs Programmieren definitiv auf! Ich vermute aber das die Methode wie ich das handhabe ein Albtraum für Profis darstellt. Jedoch war das ein Codeschnipsel der grundlegend Funktionierte und ich dann entsprechend auf meine Bedürfnisse angepasst habe.



  • #2
    Lokales Caching verwenden. Abrufen neuer Informationen nur alle X Minuten (Stunden?), ansonsten die gecachten Infos benutzen.
    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

    Kommentar


    • #3
      Entweder durch einen Cache leiten, also

      PHP-Code:
      function cache($url){
       
      // Dateinamen extrahieren
       // im Cache-Verzeichnis gucken, ob die Datei schon existiert
       // wenn nicht -> Daten ziehen und Datei anlegen
       // wenn doch -> gucken, wann die Daten das letzte Mal geschrieben wurde
       //   wenn das zu lange her ist -> Daten ziehen und in Datei schreiben
       //  Daten zurückgeben

      Wobei du dann halt alle paar Minuten den Lag hast.

      Besser wäre es, die Datei über einen Cronjob regelmäßig zu aktualisieren, damit die anderen Scripte nur noch auf die Daten aus dem Cache zugreifen.

      Noch besser ist, das in einer Datenbank zu speichern, die dir die Integrität garantiert, damit du nicht zwischendurch mal unsaubere Daten bekommst.

      Aber das kannst du ja immer weiter optimieren.
      You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.

      Kommentar


      • #4
        Die Fehler müsste er auch beseitigen, das sind einige syntax error aufgrund falscher Anführungsstriche bei echo.
        Zudem ist Table hier das falsche HTML Element, da es sich um eine Liste handelt.

        Wenn das Script 3 mal eingesetzt wird wird es 3 mal nicht funktionieren,, was dann wohl die langen Ladezeiten verursacht.

        Kommentar


        • #5
          Zitat von lstegelitz Beitrag anzeigen
          Lokales Caching verwenden. Abrufen neuer Informationen nur alle X Minuten (Stunden?), ansonsten die gecachten Infos benutzen.
          Oder das befüllen/aktualiesieren der Widgeds in Ajax Calls auslagern.

          Kommentar


          • #6
            Zitat von lstegelitz Beitrag anzeigen
            Lokales Caching verwenden. Abrufen neuer Informationen nur alle X Minuten (Stunden?), ansonsten die gecachten Infos benutzen.
            Sehe ich auch als einfachste Lösung. Dafür kann was Halbfertiges benutzt werden:
            PHP-Code:
            $store = new SQLiteObjectStore('objstore.sqlite');
            $data $store->get('data1');
            if(
            $data === false) {
              
            $data file_get_contents("https://rust-servers.net/api/?object=servers&element=detail&key=IzhbRykrLsStpEK2Vcu9WfZRUC82uTm0CBY");
              
            $store->set('data1'$data"1 Minute");  
            }
            //dito für data2 
            Muss nur noch für das Einbinden der Klasse gesorgt werden. Download s.signatur.

            LG jspit
            PHP-Klassen auf jspit.de und github

            Kommentar


            • #7
              Zitat von chorn Beitrag anzeigen
              Besser wäre es, die Datei über einen Cronjob regelmäßig zu aktualisieren, damit die anderen Scripte nur noch auf die Daten aus dem Cache zugreifen.
              Belastet den externen Server nur unnötig, wenn nicht permanent gleichzeitig zig user die Seite frequentieren.
              Er hat jetzt 2 Aufrufe im Script und dieses wird insgesamt 3x benutzt. Werden für die Aufrufe nur leicht unterschiedliche Lebenszeiten beim Cachen benutzt, erfolgen die API-Zugriffe asynchron und die Verzögerungen auf der Webseite dürften sich in Grenzen halten. Mit deinen Vorschlag dies durch einen Cache zu leiten hat er ja eine Anleitung, wenn er dies komplett selbst machen möchte, was auch nicht so schwer ist.
              PHP-Klassen auf jspit.de und github

              Kommentar


              • #8
                Zur (perfekten) Lösung gehören doch 2 Teile, nicht?

                1. Der Abruf der Daten per AJAX so dass auch für den, der die Daten direkt abrufen muss die Seite normal lädt (Und die Daten per JS eingefügt werden sobald die da sind).
                2. Das Cachen der abgerufenen Daten, so dass nur der auf die Antwort der API warten muss, der halt blöderweise der Erste nach Ablauf des Caches ist. Je nachdem ist ein Cache sogar notwendig, da die API vielleicht auch ein Limit hat, welches man nicht überschreiten darf.

                Kommentar


                • #9
                  Per Cache ist keine Lösung da die Angezeigten Daten Quasi Live sein müssen und durch den Provider der API schon eine gewisse Verzögerung produziert wird. Mittels Ajax bin ich komplett raus da bräuchte ich das fertige Script da ich davon null verstehen würde.

                  Gibt es nicht eine Methode, das das Script nicht wartet bis alle Daten gesammelt sind und die Seite weiter Läd bzw direkt generiert und dann den Datensatz verzögert nachholt?

                  Kommentar


                  • #10
                    Da die API ja scheinbar öffentlich zugänglich ist, bzw. keine Authentifizierung benötigt, könnte die ganze Arbeit auch direkt auf dem Client gemacht werden. Also dort die API asynchron aufrufen und die Tabelle mit JavaScript befüllen.
                    Damit würdest du dir zumindest die RTT zu deinem Server sparen.
                    "Software is like Sex, it's best if it's free." - Linus Torvalds

                    Kommentar


                    • #11
                      Zitat von elaar Beitrag anzeigen
                      Gibt es nicht eine Methode, das das Script nicht wartet bis alle Daten gesammelt sind und die Seite weiter Läd bzw direkt generiert und dann den Datensatz verzögert nachholt?
                      Dein Response wird in der Regel erst gesendet wenn dein Script abgeschlossen ist. Allerdings kannst du den Output Buffer steuern und so schon Daten übertragen während das Script noch läuft. Mit JavaScript kannst du dann den Chunked Response auslesen, während weitere Chunks kommen.

                      EDIT: Ohne Asynchrone Requests ("AJAX") wirst du nicht umhinkommen dass der Client geblockt wird. Dafür machen asynchrone Requests genau das was du suchst.
                      "Software is like Sex, it's best if it's free." - Linus Torvalds

                      Kommentar


                      • #12
                        Dann bräuchte ich leider jemanden der mir das so umschreibt, das ich das Copy - Paste austauschen kann. Das kleine Script wie es jetzt existiert hat mich drei Tage und das ein oder andere graue Haar gekostet
                        Würde dann auch (wenn derjenige nichts dagegen hat) den Code der Öffentlichkeit zur Verfügung stellen.

                        Bitte Steinigt mich nicht

                        Kommentar


                        • #13
                          Naja, so ein Hexenwerk ist das ganze nicht. Dazu finden sich etliche Tutorials und Hilfestellungen im Internet.
                          Aber dann wird das ein Mod vermutlich in Projekthilfe verschieben (müssen) hausl.
                          "Software is like Sex, it's best if it's free." - Linus Torvalds

                          Kommentar


                          • #14
                            Zitat von elaar Beitrag anzeigen
                            Das kleine Script wie es jetzt existiert hat mich drei Tage und das ein oder andere graue Haar gekostet
                            Dann legst du jetzt halt noch mal drei Tage drauf. Dann ist eh schon Wochenende.
                            You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.

                            Kommentar


                            • #15
                              Selbst wenn ich aus den drei Tagen drei Monate machen würde das mich leider nicht zum erfolg führen. Programmieren an sich enthebt sich meines Verständnisses. Codeschnippsel zusammen fügen und kleine Lücken füllen ist da für mich schon schwerst Arbeit.

                              Ich glaube das der Vorschlag von JaMa der vernünftigste ist. vlt. findet sich ja Jemand, der sich meiner annimmt.
                              Trotzdem vorab ein großes Dankeschön an jeden hier!

                              Kommentar

                              Lädt...
                              X