PHP-Puffer warum \r\n

Lesezeit: 4 Minuten

PHP Puffer warum rn
Ben

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

    – 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

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?

    – cambraka

    16. November 2010 um 5:39 Uhr

  • @cambraca Ziemlich viele Hinweise in der flush() Handbuchseite – php.net/manual/en/function.flush.php

    – Phil

    16. November 2010 um 5:42 Uhr

  • 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

1647859447 58 PHP Puffer warum rn
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.

    – SiKing

    30. Juni 2014 um 19:51 Uhr

1005310cookie-checkPHP-Puffer warum \r\n

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

Privacy policy