“Transfer-Encoding: Chunked”-Header in PHP

Lesezeit: 4 Minuten

Transfer Encoding Chunked Header in PHP
Ddwerffdsf

ich will hinzufügen Transfer-Encoding: chunked Header zu der Datei, die ich ausgebe (es wird nur Klartext generiert), aber wenn ich Folgendes hinzufüge:

header("Transfer-Encoding: chunked");
flush();

der Browser möchte die Datei nicht öffnen.

Die Webseite unter … ist möglicherweise vorübergehend nicht verfügbar oder wurde dauerhaft an eine neue Webadresse verschoben.

was muss ich tun damit es funktioniert?

  • schickst du auch a Content-Length Header?

    – Plackerei

    26. Januar ’11 um 20:42

  • Nein, Sie sollten die nicht einschließen Content-Length Header. Der ganze Sinn von Transfer-Encoding: chunked besteht darin, dass Ihr Inhalt dynamisch generiert wird, sodass Sie die Inhaltslänge nicht a priori kennen und diesen Header daher nicht festlegen können.

    – james.garriss

    4. November ’11 um 12:50

1641733780 354 Transfer Encoding Chunked Header in PHP
KingCrunch

Sie müssen die senden Content-Length mit jedem Stück, das Sie senden. Ansehen Wikipedia für einen ersten Eindruck, wie eine Chunked-Codierung aussieht. Es ist nicht so trivial und in vielen Fällen überdimensioniert.

Update: Zuerst senden Sie die Header, da diese immer vor allen Inhalten gesendet werden müssen (auch mit Chunked-Encoding). Dann senden Sie (für jeden Chunk) die Größe (in hexadezimal) gefolgt vom Inhalt. Merken flush() nach jedem stück. Als letztes müssen Sie einen Chunk ohne Größe senden, um sicherzustellen, dass die Verbindung ordnungsgemäß geschlossen wird.

Es ist nicht getestet, aber so ähnlich

header("Transfer-Encoding: chunked");
echo "5rn";
echo "Hello";
echo "rnrn";
flush();
echo "5rn";
echo "World";
echo "rn";
flush();
echo "0rnrn";
flush();

  • Sie müssen wirklich nicht darüber nachdenken, es sei denn, Sie müssen Inhalte von einigen MB senden. Ich werde meine Antwort jedoch mit grundlegenden Anweisungen aktualisieren

    – KingCrunch

    26. Januar ’11 um 21:09

  • und wie wandelt man den Text in Blöcke um? zum Beispiel, wenn meine Ausgabe ist Hello_World_:)

    – Ddwerffdsf

    26. Januar ’11 um 21:17

  • Diese Frage ergibt wenig Sinn… Ein Chunk ist ein Inhalt, den Sie als Inhalt definieren. Die Idee ist, dass Sie ein lang laufendes Skript haben, das viele Daten produziert. Von Zeit zu Zeit können Sie einige dieser Daten an den Client senden, um Speicher zu sparen und dem Client während der Wartezeit etwas zu tun zu geben 😉 In Ihrem Fall (Hello_World_:)) können Sie diese Zeichenfolge natürlich in Stücke aufteilen, aber das macht wirklich keinen Sinn.

    – KingCrunch

    26. Januar ’11 um 21:44

  • Ich bin kein Experte, aber ich denke, diese Antwort kann falsch sein. Nichts davon passt zur Antwort hier: stackoverflow.com/questions/2481858/… . Sofern ich das nicht falsch verstehe, kümmern sich PHP und Apache um die Low-Level-Codierung (Ausgabe von Chunk-Größen), sodass Sie nur ein- oder mehrmals vor dem Ende Ihrer Ausgabe ein flush() ausführen müssen, und die Antwort wird in Chunked sein Codierung übertragen. Und das passt zu meiner Erfahrung beim Betrachten von Ergebnissen in Firefox (Ergebnisse werden allmählich geladen)

    – Harry Wood

    23. März ’12 um 17:23

Wie frühere Mitglieder sagten, müssen Sie dem Chunked Transfer Encoding Format folgen.
Im nächsten Beispiel zeige ich, wie Sie eine Benutzerfunktion verwenden können, um Formatregeln zu befolgen:

<?php
//set headers
header('Transfer-Encoding: chunked');
header('Content-Type: text/html');

//browsers collect first 1024 bytes
//and show page only if bytes collected
//so we will use space padding.
//if you cannot understand what it means
//check script with PADDING=0
define("PADDING", 16);

//caret return and new line characters as constant
define("RN", "rn");

//user function what get current output buffer data
//and prefixes it with current buffer length.
//next it call flush functions
function flush_data(){
    $str=ob_get_contents();
    ob_clean();
    echo dechex(strlen($str)).RN.$str.RN;
    ob_flush();
    flush();
}

//default HTML 5 page
echo "<!doctype html><html><head><title>Transfer-Encoding: chunked</title>";
echo "<script>";

//+padding
for($i=0;$i<PADDING;$i++){
    //64 spaces (1 block)
    echo "                                                                ";
}
echo "</script></head><body><div>";

//current output buffer will shown immediately in browser
//after this function
flush_data();

//cycle wait 1 sec before next iteration
for($i=0;$i<5;$i++)
{
    //print iteration number
    echo "$i<br>";
    flush_data();
    sleep(1);
}

echo "</div></body></html>".RN;

//terminating part of encoding format
flush_data();
echo "0rnrn";
ob_flush();
?>

Anmerkungen:

  1. Prüfen Sie, ob «implicit_flush» ist Auf in deinem php.ini
  2. Wissen, ob der Ausgabepuffer überläuft («output_buffering» in php.ini) wird automatisch gespült.

1641733780 349 Transfer Encoding Chunked Header in PHP
SBoys3.com

Für mich, als ich etwas mit “Transfer-Encoding: chunked” versuchte, musste ich diesen Code verwenden, damit es funktioniert:

<?php


echo "data";
header_remove("Transfer-Encoding"); 
flush();

?>

Dieser Code hat weiterhin den Header “Transfer-Encoding: chunked”.

Es setzt automatisch die Überschrift Transfer-Encoding, wenn Sie Flush verwenden, aber wenn es manuell eingestellt wird, schlägt es fehl, also versuchen Sie, es zu entfernen, um Probleme zu vermeiden. Stellen Sie außerdem sicher, dass Sie die Überschrift auf der Zeile entfernen, bevor Sie Ihre erste Spülung durchführen, um Fehler zu vermeiden.

1641733780 325 Transfer Encoding Chunked Header in PHP
Partha Pal

Benutzen ob_flush(); Vor flush();

Beispielcode:

<?php
        header('Content-Encoding', 'chunked');
        header('Transfer-Encoding', 'chunked');
        header('Content-Type', 'text/html');
        header('Connection', 'keep-alive');

        ob_flush();
        flush();

        $p = "";  //padding
        for ($i=0; $i < 1024; $i++) { 
            $p .= " ";
        };
        echo $p;

        ob_flush();
        flush();

        for ($i = 0; $i < 10000; $i++) {
            echo "string";
            ob_flush();
            flush();
            sleep(2);
        }

?>

.

212460cookie-check“Transfer-Encoding: Chunked”-Header in PHP

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy