Würden Sie erklären, wie die Chunks aus der Datei gewonnen werden? Bitte? ^_º
– José Manuel Abarca Rodríguez
27. Januar 21 um 22:24 Uhr
Achtung: Einstellung header("Transfer-encoding: chunked"); unterbricht explizit die native Chunked-Codierung von PHP und berechnet und sendet die Chunk-Längen nicht mehr!
– Reinstaat
25. März 21 um 11:26 Uhr
Eine PHP-Antwort wird immer aufgeteilt, wenn Sie keinen Header mit Inhaltslänge angeben, und es kommt zu einem Flush. (was automatisch nach x Bytes passieren wird, weiß nur nicht genau wie viel).
Das ist eine seltsame Sache, um die man sich kümmern muss. Ist das eine Art akademische/lernende Übung oder gibt es ein reales Problem, das Sie zu lösen versuchen?
Ich möchte eine Chunked-Transfer-Codierung erzwingen, weil ich ein Ruby-Skript teste, das es lesen können soll. Also, wenn ich dich richtig verstehe, brauche ich nur etwas Flush(); Zeilen ein, um regelmäßig ausgeführt zu werden, und das zwingt PHP, in Chunked Transfer Encoding zu antworten. Keine Notwendigkeit, Chunk-Größenzahlen explizit auszugeben?
– Harry Holz
23. März 2012 um 11:07 Uhr
Apache sollte das für Sie selbst erledigen. Wenn Apache die Länge nicht im Voraus kennt, hat es grundsätzlich keine andere Wahl, als „chunked“ zu verwenden.
– Evert
23. März 12 um 12:09 Uhr
Apache puffert vor dem Senden eine bestimmte Menge an Ausgaben. Wenn Ihre gesamte Ausgabe in den Puffer passt, wird sie nicht aufgeteilt, es sei denn, Sie erzwingen dies.
– sosiouxme
9. März 14 um 0:53 Uhr
Orwellophil
Das ist ein wenig vauge geworden … wenn Sie nichts gegen große Brocken haben (0x1000 Oktette oder so), dann ja, PHP wird sie machen.
<?php
while (true) {
# output data
flush()
usleep(pow(2,18));
}
?>
PHP generiert die nummerierten Abschnitte usw.
Wenn Sie winzig kleine Brocken senden möchten, wie Sie es vielleicht mit einem AJAX-Client tun … Nun, ich habe die OPs-Frage mit etwas Recherche zu PHP.NET kombiniert, und es sieht so aus, als wäre er einer guten Sache auf der Spur .
HTTP/1.1 200 OK
Date: Wed, 23 May 2012 13:03:01 GMT
Server: Apache/2.2.9 (Debian) PHP/5.3.5-1 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8o
X-Powered-By: PHP/5.3.5-1
Transfer-encoding: chunked
Content-Type: text/html
14
Teachers have class.
50
We secure our friends not by accepting favors but by doing them.
-- Thucydides
48
Vulcans never bluff.
-- Spock, "The Doomsday Machine", stardate 4202.1
31
All kings is mostly rapscallions.
-- Mark Twain
41
Reappraisal, n.:
An abrupt change of mind after being found out.
49
He who knows, does not speak. He who speaks, does not know.
-- Lao Tsu
Ob es schließlich seine eigene (falsche) Chunk-Anzahl herausquetschen wird oder nicht, bleibt abzuwarten … aber ich habe keine Anzeichen dafür gesehen.
Wenn Sie jeden Ausgabepuffer loswerden möchten, wird auf diese Weise nur die Hälfte davon entfernt (aufgerundet). Benutzen while(ob_get_level()){ob_end_flush();} stattdessen. Wenn Sie vermeiden möchten, dass die Funktion wiederholt aufgerufen wird: for($i=ob_get_level(); $i; --$i){ob_end_flush();} oder $i=ob_get_level()+1;while(--$i){ob_end_flush();} (Verwenden Sie Post-Decrement, wenn +1 ungerade erscheint). Danke für das Netcat-Beispiel, HTTP ist viel einfacher als ich erwartet hatte, was lustig ist, da ich es gesehen habe <method> <path> <HTTP version>, Kopfzeilen und Textkörper, aber sie werden normalerweise separat angezeigt, wenn ich sie ansehe.
Aus irgendeinem Grund wird die Seite nur angezeigt, wenn die gesamte Seite gerendert wird, anstatt zuzunehmen. Wissen Sie, was das Problem gewesen sein könnte?
– Schrittmacher
14. Juli 13 um 6:08 Uhr
Welche Konfiguration verwendest du? (Apache-Version, Module, PHP-Version)?
Warum verwenden Sie die Ausgabepufferung? Sie scheinen es nicht zu brauchen, es sei denn, Sie ändern Header, nachdem die Ausgabe begonnen hätte, Sie wenden eine Funktion auf die Ausgabe an oder speichern den Puffer über ob_get_clean() in einer Variablen.
– Chinoto Vokro
16. Dezember 16 um 23:24 Uhr
Sie sollten in der Lage sein, Folgendes zu verwenden:
<?php header("Transfer-Encoding: chunked");
Sie müssen jedoch selbst sicherstellen, dass die Ausgabe den Spezifikationen entspricht.
skibulk
Der Ausgabepuffer wird erst an den Browser gesendet, wenn er voll ist. Die Standardgröße ist 4096 Bytes. Sie müssen also entweder die Puffergröße ändern oder Ihre Chunks auffüllen. Außerdem kann der Browser einen eigenen minimalen Puffer haben, bevor die Seite angezeigt wird. Beachten Sie, dass gemäß der Wikipedia-Artikel über Chunked Encoding, Senden a 0rnrn chunk beendet die Antwort.
Wenn Sie die Einstellung für die Ausgabepuffergröße ändern möchten, habe ich gelesen, dass Sie sie nicht verwenden können ini_set('output_buffering', $value). Ändern Sie stattdessen die Einstellung für die Ausgabepufferung, indem Sie Folgendes zu Ihrer php.ini-Datei hinzufügen.
php_value output_buffering 1024
Hier ist ein Beispiel für das Auffüllen Ihrer Chunks
header("Transfer-Encoding: chunked");
header("Content-Encoding: none");
// Send chunk to browser
function send_chunk($chunk)
{
// The chunk must fill the output buffer or php won't send it
$chunk = str_pad($chunk, 4096);
printf("%xrn%srn", strlen($chunk), $chunk);
flush();
}
// Send your content in chunks
for($i=0; $i<10; $i++)
{
send_chunk("This is Chunk #$i.<br>rn");
usleep(500000);
}
// note that if you send an empty chunk
// the browser won't display additional output
echo "0rnrn";
flush();
Hier ist eine kurze Version, die demonstriert 0rnrn Ausgabe beenden:
Sie können nach jedem Chunk spülen.
– Gumbo
1. Juli 10 um 6:39 Uhr
Würden Sie erklären, wie die Chunks aus der Datei gewonnen werden? Bitte? ^_º
– José Manuel Abarca Rodríguez
27. Januar 21 um 22:24 Uhr
Achtung: Einstellung
header("Transfer-encoding: chunked");
unterbricht explizit die native Chunked-Codierung von PHP und berechnet und sendet die Chunk-Längen nicht mehr!– Reinstaat
25. März 21 um 11:26 Uhr