20

こんにちは、以下のコードをご覧ください:

<?php
ob_start();

echo "Start ...<br />\n";
for( $i = 0 ; $i < 10 ; $i++ )
{
    echo "$i<br />\n";
    ob_flush(); 
    flush();
    sleep(1);
}
echo "End ...<br />\n";
?>

それは間違っていますか?私はそれをテストしましたが、スクリプトが完了すると出力が表示されます。解決策はありますか?

4

12 に答える 12

14

ねえ、私もこの問題で立ち往生していましたが、最終的に正しい解決策を見つけました。それはあなたのためです

ページにコンテンツ タイプを追加する必要があります。これは、次の 2 つの方法で行うことができます。1. html タグを使用する

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

元。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Wp Migration</title>
</head>
<body>
<?php 
for($i=0;$i<70;$i++)
{
echo 'printing...<br>';
ob_flush();
flush();
sleep(3);
}
?>
</body>
</html>
  1. PHPヘッダー関数の使用

    <?php header( 'Content-type: text/html; charset=utf-8' ); ?>

元。

<?php 
header( 'Content-type: text/html; charset=utf-8' );
for($i=0;$i<70;$i++)
{
echo 'printing...<br>';
ob_flush();
flush();
sleep(3);
}
?>

ではごきげんよう

于 2013-06-12T13:15:54.447 に答える
6

一部のブラウザーは、レンダリングを開始する前に少なくとも 256 文字を受け取る必要があります。次のような出力をすでに詰め込もうとしましたか?

echo str_repeat('&nbsp;', 50) . "$i<br />\n";

編集

Apache/2.2.11 (Win32) DAV/2 mod_ssl/2.2.11 OpenSSL/0.9.8i PHP/5.2.9の設定でOPの問題を再現できました

zlib.output_compression = On

再びオフにする

zlib.output_compression = Off

スクリプトを希望どおりに機能させました。

于 2011-04-24T14:48:29.997 に答える
4

最初の行でへの呼び出しを削除してみてくださいob_start()。出力バッファリングを有効にする必要はありません。おそらく、ここで問題が発生します。


私はあなたのコードをテストしました:

  • が最初の行で呼び出された場合ob_start()、スクリプトが終了して 10 秒後にのみ出力が表示されます
  • への呼び出しを削除するとob_start()、標準出力に表示されるとすぐに、毎秒 1 行の出力が表示されます。
于 2011-04-24T14:04:16.857 に答える
2

Chromeを使用して、ブラウザのバッファをバイパスするためにさらに多くのバイトが必要であることがわかりました。私の場合、4096バイトで問題ありませんでした。

echo str_repeat(' ', 4096);

また、最初にHTML要素を追加することも必須のようです。

echo $content . '<br />';
于 2012-05-24T18:14:07.360 に答える
1

私のシステムでは、サーバー側から到着したもののレンダリングを開始するために FF4 が 256 バイト以上を必要とするようです。最初にこれで解決しました:

while (@ob_end_flush());
echo(str_repeat(' ',1024));
// ...etc...
于 2011-06-16T14:52:22.410 に答える
0

正しいです。PHP 5.3.3 を実行している CLI から問題なく動作します。うまくいかない場合は、PHP インストールで出力バッファリングが無効になっている可能性があります。

出力バッファを閉じるために、スクリプトの最後にob_end_flush()を配置することもお勧めします。

于 2011-04-24T14:08:40.193 に答える
0

This flow works with Laravel too

ob_implicit_flush(true);
echo "Processing ... "; // Or give out JSON output
ob_flush();
sleep(5); //A time-consuming synchronous process (SMTP mail, maybe?)
echo "Done";
于 2017-03-22T06:41:13.177 に答える
0

IE8 と flush() に関する 1 つの卑劣な問題。テーブル内の行を「フラッシュ」している場合です。IE は、完成したテーブルのみを表示します。これは私の問題であり、コンテナーをテーブル行から div に変更すると問題が解決しました。

于 2013-08-07T08:48:57.103 に答える