PHPバッファの機能

墨辰丷
リリース: 2023-03-29 18:30:01
オリジナル
1779 人が閲覧しました

この記事では主に PHP バッファーの機能を紹介します。興味のある方はぜひ参考にしてください。

コードは次のとおりです:

<?php
for ($i=10; $i>0; $i--)
{
  echo $i;
  flush();
  sleep(1);
}
?>
ログイン後にコピー

PHPマニュアルによると:

この関数は、これまでのプログラムのすべての出力をユーザーのブラウザに送信します。

上記のコードは毎秒 $i を出力するはずです。しかし、実際には必ずしもそうであるとは限りません。 10 秒間待機した後、すべての出力が同時に表示される可能性があります。

それでは、このコードを

<?php
ob_end_clean();//修改部分
for ($i=10; $i>0; $i--)
{
  echo $i;
  flush();
  sleep(1);
}
?>
ログイン後にコピー

に変更しましょう。 ob_end_clean() を ob_end_flush() に置き換えても OK です。

<?php
for ($i=10; $i>0; $i--)
{
  echo $i;
  ob_flush();//修改部分
  flush();
  sleep(1);
}
?>
ログイン後にコピー

それを実行すると、$i も毎秒出力されていることがわかりますか?どうしてこれなの?
心配しないで、php.ini を見てみましょう。

php.ini を開き、output_buffering を検索すると、output_buffering = 4096 のような設定が表示されます。 Output_buffering という名前と同じように、この設定の機能は出力をバッファリングすることです。バッファー サイズは 4096 バイトです。

最初のコードで出力が期待どおりにならない理由は、まさにこの output_buffering がすべてのデータをバッファリングしているためです。バッファリングされた出力。出力は、4096 バイトに達するか、スクリプトが終了するまで送信されません。

2 番目のコードの ob_end_clean() と ob_end_flush() の機能は、バッファリングを終了することです。この方法では、送信前に 4096 バイトのバッファができるまで待つ必要はありません。

3 番目のコードでは、ob_flush() の機能はバッファリングされたデータを送信することですが、バッファリングは終了しないため、各 flash() の前に使用する必要があります。

ob_end_clean()、ob_end_flush()、および ob_flush() を使用したくない場合は、php.ini の Output_buffering を十分に小さく設定する必要があります (たとえば、0 に設定する)。 ini_set("output_buffering", "0") を使用してスクリプト内で設定する予定がある場合は、中止してください。このメソッドは機能しません。スクリプトの開始時にバッファリング設定が読み込まれ、その後バッファリングが開始されるためです。

ob_flush() はバッファリングされたデータを送信するのに、なぜフラッシュ() を使用する必要があるのか​​と疑問に思われるかもしれません。次のコードを使用するだけではだめでしょうか? ?

<?php
for ($i=10; $i>0; $i--)
{
  echo $i;
  ob_flush();
  sleep(1);
}
?>
ログイン後にコピー

ob_flush() と flash() の違いに注意してください。前者はPHPのバッファからデータを解放することであり、後者はバッファにないデータまたは解放されたデータをブラウザに送信することです。したがって、バッファが存在する場合は、ob_flush() と flash() を同時に使用する必要があります。

ここでflush()は必須ですか?いいえ、データが出力されるとすぐにブラウザーに送信される別の方法があります。次の 2 つのコードでは、flush() を使用する必要はありません。 (output_buffering を 0 に設定すると、ob_flush() と ob_end_clean() も必要なくなります)

<?php
ob_implicit_flush(true);
for ($i=10; $i>0; $i--)
{
  echo $i;
  ob_flush(); #如果ob函数打开的情况下
  sleep(1);
}
?>
ログイン後にコピー

<?php
ob_end_clean();
ob_implicit_flush(true);
for ($i=10; $i>0; $i--)
{
  echo $i;
  sleep(1);
}
?>
ログイン後にコピー

概要: 以上がこの記事の概要ですどの内容も皆様の学習のお役に立てば幸いです。

関連する推奨事項: プロセス制御スイッチを実装するための

php メソッドと例

チェックボックスの値を取得するための php メソッドと簡単な例

詳細PHP がテキストを使用して訪問数をカウントする方法を画像とテキストで説明します

以上がPHPバッファの機能の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート