3

コメントで、次のスクリプトに関していくつかの概念的な質問があります(すべて関連していると思います)。スクリプトは正常に機能します。

<?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();
?>

まず、なぜ\r\n<tag>\r\nブラウザに送信する必要があるのですか?ヘッダーと関係があると思います。

次に、なぜ途中でHTMLが必要なのですか?

第三に、4096ではなく256バイトを使用する例がたくさんあります。ただし、256を使用するとスクリプトが機能しません。これらの例は古くなっていますか?この数は将来再び変更されますか?

//ソースリンクに関する編集

このコードは、主にphp.netsleep()関数の解説とこのSO質問の解決策から収集されました。どちらも、を含める理由については言及していません\r\n

//ヘッダーに関する編集

\r\n、HTMLタグ、および2番目のセットを追加しないと\r\n、スクリプトはChromeまたはSafariで正しく実行されません(すべての値を一度にダンプするだけです)。

さらに、これがの前に呼び出されると、session_start()「セッションキャッシュリミッターを送信できません-ヘッダーはすでに送信されています」というエラーがスローされます。

4

3 に答える 3

2

まず、なぜ\r\n<tag>\r\nブラウザに送信する必要があるのですか?ヘッダーと関係があると思います。

次に、なぜ途中でHTMLが必要なのですか?

通常、ブラウザは、応答がレンダリングされるまで、応答全体をフェッチするまで待機する必要があります(最後の文字まで有効なXMLについて考えてみてください)。ただし、それではユーザーエクスペリエンスが低下するため、ほとんどのブラウザはコンテンツの解析とレンダリングをできるだけ早く開始します。

そしてここで、このHTMLフラグメントは、ブラウザーが実際にDOMを構築してレンダリングを開始するためのイニシエーターになる可能性があります。

第三に、4096ではなく256バイトを使用する例がたくさんあります。ただし、256を使用するとスクリプトが機能しません。これらの例は古くなっていますか?この数は将来再び変更されますか?

マニュアルでは、Webサーバーにさらにバッファリングが組み込まれている可能性があることを示唆しているため、これは、期待される効果を得るためにフラッシュされるバッファをオーバーフローさせようとする試みである可能性があります。

于 2010-11-16T06:44:36.043 に答える
1

を使用する理由は、\r\nのようなWindowsソースビューアを使用して表示したときに出力が適切にレンダリングされるようにするためnotepad.exeです。

ここではヘッダーとは何の関係もありません。

コードが出力バッファリング関数を使用しているので、4kbのバッファをオーバーフローさせる必要があると感じる理由がわかりません(標準のデフォルトですが、php.iniより多くの専門家はデフォルトの出力バッファリングを選択しません)。

于 2010-11-16T05:29:29.077 に答える
-1
<?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();
?>
于 2014-06-30T19:32:57.040 に答える