Seiten schon übertragen, wenn cgi noch läuft?



  • Hallo,

    ich habe ein CGI-Programm geschrieben, und verwende es zusammen mit einem Apache Server.
    Ich musste aber feststellen, dass im Browser die Seite erst zu laden beginnt, wenn das Programm fertig und wieder beendet ist. Ich hätte aber gern, dass die Ausgaben, die gleich zu beginn erzeugt werden, wie der body-Tag mit Hintergrund, bereits geladen wedren, während das Programm noch die Berechnungen für den eigtl. Inhalt durchführt.

    Ist das eine Sache des Browsers, dass der auf ein EOF wartet, oder des Servers, dass er die Daten erst rausläst, wenn das Programm beendet ist?
    Kann bzw. sollte (Sicherheit?) man das verändern? Wenn ja, wie (ich darf .htaccess erstellen, aber nicht in der httpd.conf rumbasteln).

    Vielen Dank!



  • Hi,

    Keine Ahnung, ob's da dran liegt:
    Aber normalerweise schreibst du ja die Ausgabe in deinem Script auf STDOUT.
    Dieses ist jedoch gepuffert -> erst wenn der Puffer voll oder das Programm zu Ende ist, wird der geleert (= Ausgabe).

    Schalte diesen mal aus.

    Unter Perl geht's glaub ich mit:

    $|++;
    

    (vgl: http://selfhtml.teamone.de/navigation/quickbar/index.htm)

    mit PHP: keine Ahnung
    mit C: fflush(STDOUT)
    mit C++: cout.flush() (???)

    mfg
    Martin



  • Wie annonymus bereits geschrieben hat, wird das ganze erst gepuffert und dann übertragen.

    Allerdings stellt sich die Frage, ob es überhaupt Sinn macht, dass der Browser vorerst nur <html>, evtl. noch Headerdaten und <body> bekommt. Schließlich kann er erst dann richtig wissen wie er die Seite aufbauen soll, wenn er </body> erhalten hat bzw. das Dateiende.



  • AFAIK zeigt der Internet Explorer die Seite erst an, wenn alle Daten übertragen wurden.



  • Ich dachte mir halt, dann kann der Benutzer wenigstens schon mal den Hintergrund sehen, und merkt, dass das Script arbeitet, sonst sieht das für ca. 5 sek. so aus, als ob die Seite tot ist, weil unten der Statusbalen immer weiter wandert, aber nix passiert.
    Außerdem kann ich vor dem body ja schon mit javascript das preloading der Bilder starten.

    Also liegts weder an Browser noch Server sondern an meinem Programm. werds gleich mal testen, Danke.



  • PAB schrieb:

    AFAIK zeigt der Internet Explorer die Seite erst an, wenn alle Daten übertragen wurden.

    Da weisst Du falsch. Schau Dir mal Seiten wie spotlight.de auf ISDN oder kleiner an, da sieht man deutlich, dass die Seite mit der Zeit waechst. Die Erfahrung hab ich bis jetzt mit praktisch jedem Browser gemacht. Ausnahme sind alte Netscape-Versionen (oder wars Opera?) bei der Darstellung von Tabellen.



  • Ja stimmt, auch Internet Explorer läd und zeigt die Seite wenn man den flush Befehl nutzt.
    Mit folgendem kleinem Programm sieht man's deutlich (WindowsApache als Server):

    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    int main()
    {
    	cout << "Content-Type: text/html" << endl << endl;
    	cout << "Test mit Flush<br>";
    	cout.flush();
    	Sleep(5000);
    	cout << "Test nach Verzögerung";
    	return(0);
    }
    


  • Ich kenn das aus nem recht grossen YaBB-Forum, wo die Antwortseite in längeren Threads erst nach dem vollständigen Laden der Seite erscheint.



  • Hängt aber evtl. damit zusammen, dass die Antworten in einer Tabelle stehen, oder? Muss ja nicht unbedingt an der Übertragung liegen.
    Keine Ahnung was passiert, aber was is wenn man noch wärend des Seitenaufbaus sich den Quelltext anzeigen lässt? Bei meinem Programm wird da schon der erste Teil angezeigt, kannst ja mal probieren, wenn du Lust hast.



  • Stimmt, das könnte auch sein 🙂


  • Mod

    Gratulation - er habt gerade entdeckt, warum man tabellen nicht als layout mitteln missbrauchen soll 😉



  • Die sind schon längst ausm Layoutteil meiner Seite verbannt 😉


Anmelden zum Antworten