PHP 出力バッファリングとその応用

WBOY
リリース: 2016-06-23 13:13:01
オリジナル
954 人が閲覧しました

バッファ (buffer) は、スループット速度が大きく異なるデバイス間のデータ転送を調整するために使用される技術であり、コンピューター サイエンスの分野では、データが 1 つの場所から転送されるときに、バッファーされたデータを格納するために使用される領域をバッファーと呼びます。別の場所では、バッファはデータを一時的に保存するために使用されます。バッファリングに似たテクノロジはキャッシュです。どちらも、データ ストレージと転送速度の違いによって生じる問題を解決するために設計されています。違いは、バッファリングは主に書き込み時に使用されるのに対し、キャッシュは主に読み取り時に使用されることです。

上に示したように、左端の入口のデータは単一の入力量が小さく、高速で大量の特性を持っていますが、右端の出力データは の特性を持っています。量が多くて速度が遅い。バッファがないとデータの輻輳が発生しやすくなりますが、バッファがあればデータをバッファに満杯にして均一に出力することでシステムの負担を大幅に軽減できます。

PHP の実行中に、埋め込まれた HTML コード、'echo'、'print_r' などの命令はすべて一度出力されます。バッファーが存在するからこそ、システムは PHP の実行後にデータを再度送信することができます。ブラウザに次のコードを実行します:

<?phpecho "这里是第一行数据";echo "这里是第二行数据,下面睡眠5秒";sleep(5);echo "这里是第三行数据,下面是HTML代码";?><h1>标题</h1>
ログイン後にコピー

ブラウザは最初にデータの 1 行目と 2 行目を表示し、5 秒待ってから後続のデータを表示するのではなく、すべてのコンテンツを同時に表示することがわかりました。 。それだけでなく、PHP のバッファは、データを送信する前にキャプチャ、変更などを行うことができる、より強力な機能も提供します。 PHP は、特定の文字を置換できる次のコードのような「ob_」シリーズの関数を提供します:

<?phpob_start();echo "Hello world, this is http://www.hitoy.org/";$content = ob_get_contents();ob_end_clean();echo str_replace("http://","https://",$content);?>
ログイン後にコピー

上記の ob_start、ob_get_contents、および ob_end_clean は、ユーザー バッファーを開き、キャッシュ コンテンツを取得し、閉じるために使用されます。 PHP のすべての出力制御関数は次のとおりです:

flush — 出力システム バッファーをフラッシュします

ob_clean — 出力バッファーをクリア (消去) します

ob_end_clean — バッファーをクリア (消去) し、出力バッファーを閉じます

ob_end_flush — 出力バッファーの内容をフラッシュ (送信) し、バッファーを閉じます

ob_flush — 出力バッファーの内容をフラッシュ (送信) します

ob_g​​et_clean — 現在のバッファーの内容を取得し、現在の出力バッファーを削除します。

ob_g​​et_contents — 出力バッファの内容を返します。

ob_g​​et_flush — バッファの内容をフラッシュ (送信) し、内容を文字列として返し、出力バッファを閉じます。

ob_g​​et_length — 出力バッファーのコンテンツの長さを返します

ob_g​​et_level — 出力バッファーメカニズムのネストレベルを返します

ob_g​​et_status — すべての出力バッファーのステータスを取得します

ob_g​​zhandler — 出力バッファーを圧縮するために ob_start で使用されます Content コールバック関数。 gzip 出力バッファへの ob_start コールバック関数

ob_implicit_flush — 絶対フラッシュのオン/オフを切り替えます

ob_list_handlers — 使用中のすべての出力ハンドラーをリストします。

ob_start — 出力制御バッファーをオンにする

output_add_rewrite_var — URL リライター値を追加する (URL リライター値を追加する)

output_reset_rewrite_vars — URL リライター値をリセットする (URL リライター値をリセットする)

php では、次のことができますphp.ini の Output_buffering を通じてキャッシュを設定します。オンは無限を意味し、オフは閉じていることを意味し、数値はバッファーのサイズ (バイト単位) を表します。オフに設定されている場合は、例のコードになります。 1 ブラウザ上で分割表示することはできますか?答えはノーです。注意すべき点が 2 つあります。1 つ目は、PHP のキャッシュがオフになっている場合でも、PHP 出力はシステム レベル (Linux システムの stdout キャッシュとして理解できます) でキャッシュされるということです。 2 番目の点は、一部のブラウザでは一度に受信するテキストの長さに制限があり、長すぎると表示されないことです。したがって、そのようなコードはセクションで表示できます:

<?phpecho "这里是第一行数据";echo str_repeat(" ",1024);echo "这里是第二行数据,下面睡眠5秒";flush();sleep(5);echo "这里是第三行数据,下面是HTML代码";?><h1>标题</h1>
ログイン後にコピー

もちろん、実際の運用環境では、ob_ 一連の関数を通じてそれを操作することはできません。次の例では、サーバー プッシュにバッファリングを使用しています (comet. ) 例。次のコードはクライアントに情報をプッシュできます:

<?phpob_start();$i=0;while($i<100){    echo $i.str_repeat(" ",2024);    $i++;    ob_flush();    flush();    sleep(5);}?>
ログイン後にコピー

リファレンス

  1. 出力制御関数

  2. php_buffering に関する質問

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