4

これは純粋に出力バッファリングについてさらに学ぶためのものであり、それ以上のものではありません。私がやりたいのは、文字列をブラウザにエコーし、10秒間スリープしてから、別の何かをエコーすることです。通常、ブラウザは10秒間待機してから結果全体を投稿しますが、どうすれば停止できますか?例:

ob_start();
echo "one";
sleep(10);
echo "two";
4

6 に答える 6

5

faileNの答えは理論的には正しいです。データがないとob_flush()、データはPHPのバッファーに残り、リクエストの最後にバッファーが暗黙的にフラッシュされるまでブラウザーに到達しません。

それでも機能しない理由は、ブラウザにもバッファが含まれているためです。データは正しく送信されるようになりましたが、ブラウザは「1」を取得した後、実際にレンダリングを開始する前に待機します。そうしないと、接続が遅い場合、ページのレンダリングが非常に遅くなります。

回避策(正しく機能していることを示すため)は、もちろん、一度に大量のデータ(おそらく、巨大なhtmlコメントなど)を送信するか、コマンドラインでcurlなどのツールを使用することです。

この送信/スリープサイクルをクライアントのステータス更新UIに使用する場合は、別の方法(ロングポーリングやAJAXなど)を見つける必要があります。

于 2010-09-10T15:52:45.140 に答える
3
ob_start();
echo "one";
ob_flush();
sleep(10);
ob_start();
echo "two";

それはあなたが意味することですか?

于 2010-09-10T15:13:34.450 に答える
1

私が正しく理解していれば、応答の一部を画面に印刷し、10秒待ってから残りを出力しようとしています。これはすべて、ページの読み込み時に行われます。PHPは最後に応答全体を出力するため、これにはクライアント側のスクリプトが必要になります。

ob_flushとflushの組み合わせは機能するかもしれませんが、バッファリングはすべてのブラウザ(IEなど)で同じように処理されるわけではありません。

于 2010-09-10T15:21:55.673 に答える
1

これにはJavaScriptのsetTimeOut()関数を使用します。正常に動作します。さらに、<noscript>JavaScriptが無効になっているブラウザにタグを使用できます。

 $txt = setPageHeader();  // a PHP function that returns a new DOCTYPE
                          // plus <html><head>(...)</head>, 
                          // plus an opening <body> tag

echo 'All things were completed. You should be redirected in about 3 seconds';

  $txt .= '<script type="text/javascript">';
  $txt = $txt.'function Rediriger() {document.location.replace(\'http://yoursite.com/yourpage.php?anticaching='.rand().'\');}';
  $txt .= 'setTimeout (\'Rediriger()\', \'3000\')';
  $txt .= '</script>';
  $txt .= '<noscript><a href="http://yoursite.com/yourpage.php?anticaching='.rand().'">Javascript is disabled in your browser. Click here for being redirected.</a></noscript>';
  $txt .= '</body></html>';
  echo ($txt);
于 2012-01-20T17:23:26.850 に答える
0

ob_flush()を使用しますが、これによりバッファの内容がクリアされます。バッファに遅延を注入することはできません。そのようには機能しません。

バッファ全体を一度に出力するか、後で使用するためにバッファ全体を保持します。

于 2010-09-10T15:13:13.653 に答える
0

どのブラウザエンジンがXHTMLページの半分を解析し、その後(XMLの半分をレンダリングする方法は?)他の部分を読み取るため、ブラウザがドキュメントのフルバージョンを待機しているため、できません。

バイナリデータがサンディングされたため、ブラウザに通知する前にヘッダーを送信することを検討する必要があります。その後、ブラウザは受信後にデータを取得し、このデータを画面上ですぐに取得します。

私は文字列バッファに注入することを考えたことがないので、この質問を理解できません。

于 2010-09-10T15:13:19.553 に答える