Eduard Seibel: Sinn von Transfer-Encoding Chunked?

Hallo!

Mittels des Header Feldes Transfer-Encoding: chunked wird ja bei dynamisch erzeugten Inhalten, bei denen die Größe im Moment des Requests nicht bekannt ist, die Daten Häpchenweise übertragen.

Ich frage mich nun, ob die Übertragung der fertig generierten Daten schon mal anläuft, bevor das Dokument vollständig generiert wurde.

Ich habe mir ein kleines PHP Script gemacht, welches 10 Zeilen Daten ausgibt und pro Zeile eine Sekunde wartet (sleep(1)) -> das Script läuft also 10 Sekunden lang. Transfer ist auch auf chunked gestellt. Trotzdem kommen alle Daten auf einmal nach dem 10 Sekunden verstrichen sind.

Das macht indem Fall doch keinen Sinn, dann würde man einfach warten bis es fertig generiert ist, und in den Header die Content-Lengh reinschreiben.

Warum also chunked Encoding, wenn sowieso gewartet wird bis das Dokument fertig generiert wurde?

Viele Grüße
Eduard Seibelk

  1. Hi,

    Mittels des Header Feldes Transfer-Encoding: chunked wird ja bei dynamisch erzeugten Inhalten, bei denen die Größe im Moment des Requests nicht bekannt ist, die Daten Häpchenweise übertragen.

    ich hätte ja sofort "Nein" gesagt, nicht zuletzt anhand der Header dieses Forums, aber nachdem ich mir diese gerade mal angesehen habe, bin ich mir nicht mehr so ganz sicher:

    GET /my/ HTTP/1.1
    Transfer-Encoding: chunked

    GET /my/?t=158985&m=1034161 HTTP/1.1
    Content-Encoding: gzip

    Läuft da irgend was falsch?

    freundliche Grüße
    Ingo

  2. Hi,

    Ich habe mir ein kleines PHP Script gemacht, welches 10 Zeilen Daten ausgibt und pro Zeile eine Sekunde wartet (sleep(1)) -> das Script läuft also 10 Sekunden lang. Transfer ist auch auf chunked gestellt. Trotzdem kommen alle Daten auf einmal nach dem 10 Sekunden verstrichen sind.

    Dann sind die 10 Zeilen vermutlich weniger als die verwendete Chunk-size (frag mich aber nicht, wo die festgelegt wird).

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Dann sind die 10 Zeilen vermutlich weniger als die verwendete Chunk-size (frag mich aber nicht, wo die festgelegt wird).

      zudem cached der Browser wohl auch bevor er das Dokument ausgibt. Das wird hier wohl eher ausschlaggebend sein!

  3. Das war wohl zu wenig Text!

    Ich habe wesentlich mehr rausgemacht und er schickt es tatsächlich häpchenweise raus, wärend der Rest noch generiert wird.

    Danke für den Tipp!

  4. Hi,

    Ich frage mich nun, ob die Übertragung der fertig generierten Daten schon mal anläuft, bevor das Dokument vollständig generiert wurde.

    Ja.

    Ich habe mir ein kleines PHP Script gemacht, welches 10 Zeilen Daten ausgibt und pro Zeile eine Sekunde wartet (sleep(1)) -> das Script läuft also 10 Sekunden lang. Transfer ist auch auf chunked gestellt. Trotzdem kommen alle Daten auf einmal nach dem 10 Sekunden verstrichen sind.

    Du mußt IMHO gar nichts einstellen - das geht automatisch.

    Aber div. Browser brauchen eine unterschiedl. "Startmenge" (max. 1024 Bytes sind mom. die Grenze), oder stellen den Inhalt erst nach einem Linebreak dar oder nach einem HTML-Element.

    Warum also chunked Encoding, wenn sowieso gewartet wird bis das Dokument fertig generiert wurde?

    Wird nicht (s.o. und PHP/JS-Countdown/Source).

    Gruß, Cybaer

    --
    Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
  5. echo $begrüßung;

    Mittels des Header Feldes Transfer-Encoding: chunked wird ja bei dynamisch erzeugten Inhalten, bei denen die Größe im Moment des Requests nicht bekannt ist, die Daten Häpchenweise übertragen.

    Wie hast du das eingestellt/konfiguriert? Oder anders gefragt: Was hast du gemacht, um diese Header-Sendung zu veranlassen?

    Ich frage mich nun, ob die Übertragung der fertig generierten Daten schon mal anläuft, bevor das Dokument vollständig generiert wurde.

    Ja, sowas geht. Aber dazu braucht es diesen Header nicht. TCP verwendet von sich aus schon in die Daten in kleinen Häppchen. Wenn zwischen den Daten-Paketen etwas Pause ist, dann ist das aus TCP-Sicht in Ordnung. Es muss dazu nicht noch in einem höheren Protokoll etwas eigenes vorgenommen werden.

    Ich habe mir ein kleines PHP Script gemacht, [...]

    PHP puffert die Ausgabe. Wenn du diesen Puffer leeren möchtest, verwende flush(). Diese Funktion versucht auch das Leeren des Puffer des Webservers anzustoßen.

    echo "$verabschiedung $name";