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
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.
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:
Prüfen Sie, ob «implicit_flush» ist Auf in deinem php.ini
Wissen, ob der Ausgabepuffer überläuft («output_buffering» in php.ini) wird automatisch gespült.
SBoys3.com
Für mich, als ich etwas mit “Transfer-Encoding: chunked” versuchte, musste ich diesen Code verwenden, damit es funktioniert:
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.
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 vonTransfer-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