Ich habe ein paar konzeptionelle Fragen (alle zusammenhängend, denke ich) in Bezug auf das folgende Skript in den Kommentaren. Das Skript funktioniert gut.
<?PHP
ob_start();
// Create string to overflow browser buffer ...?
$buffer = str_repeat(" ", 4096);
// Indicate new header / html content ...?
$buffer .= "\r\n<span></span>\r\n";
for ($i=0; $i<5; $i++) {
echo $buffer.$i;
ob_flush();
flush();
sleep(1);
}
ob_end_flush();
?>
Erstens, warum muss ich die senden \r\n<tag>\r\n zum Browser? Ich vermute, es hat etwas mit den Überschriften zu tun.
Zweitens, warum brauche ich etwas HTML in der Mitte?
Drittens gibt es viele Beispiele, die 256 Bytes anstelle von 4096 verwenden. Das Skript funktioniert jedoch nicht, wenn ich 256 verwende. Sind diese Beispiele veraltet und wird sich diese Zahl in Zukunft wieder ändern?
// BEARBEITEN IN BEZUG AUF QUELLLINKS
Dieser Code wurde hauptsächlich aus dem gesammelt Kommentar in php.net sleep() Funktion und die Lösung dieser SO-Frage. Keiner erwähnt, warum es aufgenommen werden soll \r\n.
//BEARBEITEN BEZÜGLICH HEADER
Wenn ich nicht hinzufüge \r\nein HTML-Tag und eine zweite Gruppe von \r\nwird das Skript in Chrome oder Safari nicht richtig ausgeführt (es gibt einfach alle Werte auf einmal aus).
Zusätzlich, wenn dies vor a aufgerufen wird session_start()es wird ein Fehler ausgegeben: “Sitzungs-Cache-Limiter kann nicht gesendet werden – Header wurden bereits gesendet”.
Es wäre hilfreich zu wissen, was der Zweck/das erwartete Ergebnis des Skripts ist.
– Netcoder
16. November 2010 um 5:04 Uhr
4096 Byte ist der Standardwert php.ini Ausgangspufferungseinstellung. \r\n ist nur ein typischer Zeilenumbruch in einer Windows-Umgebung.
– Phil
16. November 2010 um 5:06 Uhr
woher hast du diesen Code? was soll es machen?
– cambraka
16. November 2010 um 5:10 Uhr
+1 Dies ist eine gültige Frage. Markieren Sie sie nicht als ungültig, wenn die Beantwortung nicht in Ihrem Kompetenzbereich liegt
Erstens, warum muss ich die senden \r\n<tag>\r\n zum Browser? Ich vermute, es hat etwas mit den Überschriften zu tun.
Zweitens, warum brauche ich etwas HTML in der Mitte?
Normalerweise müssen Browser warten, bis sie die gesamte Antwort abgerufen haben, bis sie gerendert werden kann (denken Sie nur an XML, das bis zum letzten Zeichen gültig sein kann). Da dies jedoch zu einer schlechten Benutzererfahrung führen würde, beginnen die meisten Browser so früh wie möglich mit dem Parsen und Rendern der Inhalte.
Und hier könnte dieses HTML-Fragment der Initiator für den Browser sein, um das DOM tatsächlich zu erstellen und mit dem Rendern zu beginnen.
Drittens gibt es viele Beispiele, die 256 Bytes anstelle von 4096 verwenden. Das Skript funktioniert jedoch nicht, wenn ich 256 verwende. Sind diese Beispiele veraltet und wird sich diese Zahl in Zukunft wieder ändern?
Da das Handbuch darauf hinweist, dass möglicherweise weitere Pufferung in den Webserver integriert ist, könnte dies der Versuch sein, diese Puffer zum Überlaufen zu bringen, die auch geleert werden, um den erwarteten Effekt zu erzielen.
Das macht auch Sinn. Das Skript schlägt jedoch fehl, wenn ich sende \r\n sometext \r\n. Es funktioniert nur mit einem Tag in der Mitte. Würde Klartext das DOM nicht auch auslösen, nur mit einem Textknoten?
– Ben
16. November 2010 um 7:00 Uhr
@Steve: Nein, offensichtlich nicht. Obwohl normalerweise die Inhaltstyp Header-Feld gibt den Inhaltstyp an, es gibt Situationen, in denen diese Informationen fehlen. Es gibt also keine Hinweise, was tatsächlich gesendet wird und in diesem Moment MIME-Typ-Sniffing findet in den meisten Browsern statt.
– Gumbo
16. November 2010 um 7:54 Uhr
Der Grund für die Verwendung \r\n würde die Ausgabe gut rendern lassen, wenn sie mit einem Windows-Quellbetrachter wie angezeigt wird notepad.exe.
Mit Überschriften hat das hier nichts zu tun.
Da der Code die Ausgabepufferfunktionen verwendet, habe ich keine Ahnung, warum sie das Bedürfnis verspüren, einen 4-kb-Puffer (die Standardeinstellung in einer Standarddatei) zum Überlaufen zu bringen php.ini obwohl sich mehr Profis für keine Standardausgabepufferung entscheiden würden).
Ich denke, es versucht, den Puffer im Browser zum Überlaufen zu bringen, da flush() theoretisch den PHP-Puffer leeren sollte, oder?
Die Lösung für die SO-Frage, die ich in meiner ersten Bearbeitung verlinkt habe, enthält einen Kommentar, in dem der Autor sagt: “Obwohl ich \r\n’s zusammen mit dem Inhalt senden muss, bevor ich ihn ausspüle, damit er funktioniert”.
– Ben
16. November 2010 um 5:54 Uhr
Irgendwelche Vorschläge, wie man damit ohne das 4-KB-Überlaufproblem umgeht?
– Ben
16. November 2010 um 6:44 Uhr
Saeed.r
<?php
if (ob_get_level() == 0) ob_start();
for ($i = 0; $i<10; $i++){
echo "<br> Line to show.";
echo str_pad('',4096)."\n";
ob_flush();
flush();
sleep(2);
}
echo "Done.";
ob_end_flush();
?>
Bitte fügen Sie weitere Erläuterungen zu dem hinzu, was Sie zeigen.
Es wäre hilfreich zu wissen, was der Zweck/das erwartete Ergebnis des Skripts ist.
– Netcoder
16. November 2010 um 5:04 Uhr
4096 Byte ist der Standardwert
php.ini
Ausgangspufferungseinstellung.\r\n
ist nur ein typischer Zeilenumbruch in einer Windows-Umgebung.– Phil
16. November 2010 um 5:06 Uhr
woher hast du diesen Code? was soll es machen?
– cambraka
16. November 2010 um 5:10 Uhr
+1 Dies ist eine gültige Frage. Markieren Sie sie nicht als ungültig, wenn die Beantwortung nicht in Ihrem Kompetenzbereich liegt
– bcosca
16. November 2010 um 5:20 Uhr
@cambraca Google Fu! php.net/manual/en/function.sleep.php#95164
– Phil
16. November 2010 um 5:23 Uhr