https request mit curl - anzeige der HTML Elemente vor timeout

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

  • https request mit curl - anzeige der HTML Elemente vor timeout

    Hallo zusammen,
    ich habe ein Problem mit mehreren https-requests mit curl wo ich nicht mehr weiter weiß. Bei ewiger suche fand ich nichts passendes, also nun direkt hier:

    Rahmenbedingungen:
    Es geht um eine "kleine" Änderung an einer Produktiven Web-Anwendung.
    Prinzipiell geht es darum, spezielle Geräte über https-requests zu Steuern, also an- bzw. ab zu schalten und ihren Status ab zu fragen. Die tue ich über einen cUrl-request:

    PHP-Code:
        function aufruf($IP$action)
        {
            
    $url "https://$IP/nph-vpn.cgi?cmd=$action";
            
    $curl curl_init();
            
    curl_setopt($curlCURLOPT_URL$url);
            
    curl_setopt($curlCURLOPT_SSL_VERIFYPEERfalse);
            
    curl_setopt($curlCURLOPT_SSL_VERIFYHOSTfalse);
            
    curl_setopt($curlCURLOPT_HEADERfalse);      
            
    curl_setopt($curlCURLOPT_RETURNTRANSFERtrue);
            
    curl_setopt($curlCURLOPT_CONNECTTIMEOUT3);
            
    $response curl_exec($curl);  
            
    curl_close($curl);
            return 
    $response;
        } 
    Auf der "Übersichtsseite" der Anwendung sollen eben alle Geräte mit ihrem Status angezeigt werden, das klappt soweit auch wunderbar. Die Geräte werden nacheinander angesprochen und mit Ihrem Status untereinander in einer Tabelle ausgegeben.

    PHP-Code:
    while ($row=mysql_fetch_array($result)) {
    // Statusabfrage des Geräts
    // Fallunterscheidung der Zustände
    // Ausgabe des Geräts mit Zustand als neue Tabellenzeile

    Problem:
    Es kann nicht immer garantiert werden, dass alle dieser Geräte antworten, daher ein Timeout von 3 sec, was wiederum nötig ist, da die Geräte nach längerer Inaktivität zum Teil 2-3 Sekunden brauchen, bis sie antworten.
    Es kommt nicht selten vor, dass 2 Geräte, oder sogar mehr, nicht innerhalb dieser 3 Sekunden antworten. Während dieser "Timout-Zeit" wird allerdings in der Anwendung nichts angezeigt, kein Ladebalken, keine HTML Elemente, nichts. Für den Anwender sieht es so aus als ob nichts passiert. Erst wenn die Timeouts alle abgelaufen sind, wird das gesamte Ergebnis auf einen Schlag angezeigt. Im Falle von 2 nicht erreichbaren Geräten dauert das dann mindestens 6 Sekunden - zu lang um einfach "nichts" anzuzeigen.
    Ich habe schon versucht, mit flush() und obstart() -> ob_flush() zumindest die Ausgabe einer einfachen Überschrift zu erzwingen. Aber obwohl die requests im Script erst später aufgerufen werden, wird erst nach den timouts überhaupt etwas angezeigt. Ich möchte aber gerne zumindest die Überschrift sofort anzeigen, um nicht den Eindruck zu vermitteln, es würde nichts passieren.

    Es scheint mir also so, als ob die https-request trotz flush() abgewartet werden, bevor etwas ausgegeben wird.

    Ich hoffe jemand kann mir weiter helfen.
    Danke im Vorraus,
    Grüße
    Zuletzt geändert von snopi; 26.10.2011, 10:32.

  • #2
    Hallo,

    dass ein flush() nichts bewirkt, kann an der darunterliegenden Serverumgebung liegen. Es gibt Unterschiede zwischen Apache und IIS sowie zwischen dem SAPI-Modul und (Fast)CGI. Darüberhinaus kann auch der Browser sich dazu entscheiden, die Seite erst anzuzeigen, wenn das Dokument vollständig ist.

    Vielleicht wäre es besser, dass ganze mit AJAX anzugehen, dann können mehrere Requests gleichzeitig und unabhängig bearbeitet werden und bis zur Rückgabe der Ergebnisse kannst du auf der Seite anzeigen was du möchtest, um den User bei Laune zu halten.

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Hallo,

      Ich hatte gehofft, es gäbe vieleicht doch eine "schnelle" Lösung für das Problem, befürchtet habe ich aber genau solch eine Antwort ;-) Danke dennoch.

      Die Idee mit AJAX ist wirklich gut, leider habe ich damit noch keinerlei Erfahrungen sammeln können, daher kann ich das nicht "mal eben so" einbauen. Da die Anwendung an sich aber noch an anderen Ecken verbessert werden könnte, lohnt sich wahrscheinlich eine komplette Überarbeitung und damit der Umstieg auf AJAX. Ich werde mich auf jeden Fall in nächster Zeit mit diesem Thema beschäftigen.

      Danke für deine Antwort!

      Kommentar


      • #4
        Zum Thema AJAX kann ich jQuery empfehlen. Viel muss man da nicht wissen, ausser wie man eine js Datei im Header einbindet und dann auf der jquery Seite einfach mal paar Beispiele durchliest, wie man einen AJAX Request startet.

        Beispielcode als Javascript !!! (Nicht von den Dollarzeichen irritieren lassen, es ist Javascript)
        Code:
        $(function() {
            $.ajax({
                url : 'yoururl',
                method : POST||GET,
                success : function(response) {
                    alert(response);
                }
            });
        });
        Wozu brauchen wir Kraftwerke, wenn der Strom aus der Steckdose kommt.

        Kommentar


        • #5
          Ich kann mich erinnern, dass ich vor zig Jahren für sowas vor jedem flush mal einen Haufen Whitespace rausgehauen hab, wodurch ich das erreicht hab, was du auch erreichen willst.

          Bedenke aber auch, dass wenn du mod_gzip laufen hast, der Webserver trotz allem immer nur das vollständige Dokument zum Schluss im Ganzen sendet.
          Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
          Schön - etwas Geschichte kann ja nicht schaden.
          Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

          Kommentar


          • #6
            Du kannst alle Abfragen (quasi) parallel bedienen, brauchst also insgesamt nur ca. 3 Sec.

            curl_multi_init()

            Alternativ zu cURL: socket_select()
            Zuletzt geändert von combie; 27.10.2011, 10:12.
            Wir werden alle sterben

            Kommentar

            Lädt...
            X