buffer
buffer はメモリ アドレス空間で、Linux システムのデフォルト サイズは通常 4096 (4kb) で、これは 1 つのメモリ ページです。主に、速度が同期していないデバイス間や優先度の異なるデバイス間のデータ転送領域を格納するために使用されます。バッファーを使用すると、プロセスは相互に待機する時間が少なくなります。次に、より一般的な例を示します。ファイルを編集するためにテキスト エディタを開いた場合、文字を入力するたびに、オペレーティング システムはその文字をすぐにディスクに直接書き込むのではなく、書き込み時に最初にその文字をバッファに書き込みます。バッファがいっぱいの場合、バッファ内のデータはディスクに書き込まれます。もちろん、カーネル関数 flash() が呼び出されるときは、バッファ内のダーティ データをディスクに書き戻す必要があります。
同様に、echo と print が実行されると、出力は tcp を介して表示のためにクライアントのブラウザにすぐに送信されませんが、データは php バッファに書き込まれます。 phpのoutput_bufferingメカニズムは、tcpバッファの前に新しいキューが確立され、データがそのキューを通過する必要があることを意味します。 PHP バッファーがいっぱいになると、スクリプト プロセスは PHP バッファー内の出力データをシステム カーネルに渡し、表示のために TCP 経由でブラウザーに渡します。したがって、データは次の場所に順番に書き込まれます: echo/print -> tcp バッファ -> ブラウザ
php Output_buffering
デフォルトでは、php バッファーはオンになっており、バッファーのデフォルト値は 4096、つまり 4kb です。 Output_buffering 設定は php.ini 設定ファイルにあります。echo、print などでユーザー データを出力すると、output_buffering がいっぱいになるまで、データは php の out_buffering に書き込まれます。 。 見せる。 ob_start() を使用して php の出力バッファリングメカニズムを手動でアクティブにすることもできます。これにより、出力が 4kb のデータを超えた場合でも、ob_start() が php バッファスペースを次のように設定するため、データは実際には tcp に渡されず、ブラウザに渡されます。十分な大きさであること。スクリプトが終了するか、ob_end_flush 関数が呼び出されるまで、データはクライアント ブラウザに送信されません。
1.output_buffering=4096 で、出力するデータが少ない (バッファー 1 つ未満) 場合
コードをコピーします コードは次のとおりです:
for ($i = 0; $i < ; $i++) {
echo $i . '
';
sleep($i + 1)>
現象: 数秒ごとではありません断続的な出力がありますが、サーバー スクリプトの処理が完了するまで、ブラウザ インターフェイスは空白のままです。これは、データ量が少なすぎてphpのoutput_bufferingがいっぱいになっていないためです。データの書き込み順序は、echo->php バッファ->tcp バッファ->ブラウザです
2.output_buffering=0 で、出力するデータが少ない (バッファー 1 つ未満) 場合
コードをコピーします コードは次のとおりです:
//Pass ini_set('output_buffering ', 0 ) は効果がありません
////etc/php.ini を編集し、output_buffering=0 を設定して出力バッファリング メカニズムを無効にする必要があります
//ini_set('output_buffering', 0) //出力バッファリングを完全に無効にしますfunction
for ($i = 0 ; $i <10; $i++) {
echo $i . '
';
flush(); //オペレーティングシステムの最下層に通知して送信しますできるだけ早くデータをクライアントブラウザに送信します
sleep($i + 1); //
}
?>
現象: PHP バッファリングメカニズムを無効にした後、表示と一致しません。ブラウザで断続的な出力を確認できます。出力を確認するためにスクリプトが実行されるまで待つ必要はありません。これは、phpのoutput_bufferingにデータが残らないためです。データの書き込み順序は、echo->tcpbuffer->browser です
3.output_buffering=4096.の場合、出力データは1つのバッファより大きいため、ob_start()は呼び出されません
コードをコピーします コードは次のとおりです:
#//4kbを作成しますfile
$dd if= /dev/zero of=f4096 bs=4096 count=1
for ($i = 0; $i <10; $i++) {
echo file_get_contents('./f4096 ') . $i . '
';
sleep($i +1);
}
?>
現象: 応答がまだ終了していません (http 接続が閉じられていません)。断続的な出力は断続的に表示されますが、ブラウザのインターフェースは永遠に空白のままになるわけではありません。 phpのoutput_bufferingメカニズムが有効になっていますが、output_bufferingスペースが十分ではないため、1回限りの出力ではなく断続的な出力が依然として存在します。 PHP バッファリングがいっぱいになるたびに、データがクライアント ブラウザに送信されます。
4.output_buffering=4096の場合、出力データが1つのTCPバッファーより大きい場合、ob_start()を呼び出します
コードをコピーします
コードは次のとおりです:
ob_start(); //php バッファ
を開きます ($i = 0; $i <10; $i++) {
echo file_get_contents('./f4096') '< ;br/>';
sleep($i + 1);
}
ob_end_flush();
?>
現象: サーバー側スクリプトの処理が完了し、応答が終了するまで、完全な出力と出力間隔が見える 一時停止を感じられないほど短い時間です。出力前に、ブラウザは空のインターフェイスを維持し、サーバー データを待ちます。これは、PHP が ob_start() 関数を呼び出すと、ob_end_flush 関数が呼び出されるかスクリプトが終了するまで、PHP バッファーが十分なサイズに拡張されるためです。
出力バッファリング機能
1.ob_get_level
出力バッファリングメカニズムのネストレベルを返します。これにより、テンプレートが繰り返しネストされるのを防ぐことができます。
1.ob_start
は、output_bufferingメカニズムをアクティブにします。アクティブ化すると、スクリプト出力はブラウザに直接送信されなくなり、一時的に PHP バッファ メモリ領域に書き込まれます。
phpはデフォルトでoutput_bufferingメカニズムを有効にしますが、ob_start()関数を呼び出すことにより、データのoutput_buffering値が十分に大きな値に拡張されます。 $chunk_size を指定して、output_buffering の値を指定することもできます。 $chunk_size のデフォルト値は 0 です。これは、スクリプトが終了するまで php バッファー内のデータがブラウザーに送信されないことを意味します。 $chunk_size のサイズを設定すると、バッファ内のデータ長がこの値に達する限り、バッファ内のデータがブラウザに送信されることを意味します。
もちろん、$ouput_callbackを指定することでバッファ内のデータを処理することもできます。たとえば、関数 ob_gzhandler はバッファ内のデータを圧縮してブラウザに送信します。
2.ob_get_contents
PHPバッファ内のデータのコピーを取得します。 ob_end_clean() 関数を呼び出す前にこの関数を呼び出す必要があることに注意してください。そうしないと、ob_get_contents() が null 文字を返します。
3. ob_end_flush と ob_end_clean
これら 2 つの関数は似ており、どちらも ouptu_buffering メカニズムをオフにします。ただし、違いは、ob_end_flush は php バッファー内のデータをクライアント ブラウザーにフラッシュ (フラッシュ/送信) するだけですが、ob_clean_clean は php バッファー内のデータをクリア (消去) しますが、クライアント ブラウザーには送信しないことです。 ob_end_flush が呼び出された後も、php バッファー内のデータはまだ存在しており、ob_get_contents() は引き続き php バッファー内のデータのコピーを取得できます。 ob_end_clean() を呼び出した後、ob_get_contents() は空の文字列を取得し、ブラウザは出力を受け取ることができません。つまり、出力はありません。
使用例
一部のテンプレート エンジンやページ ファイル キャッシュで ob_start() が使用されていることがよくあります。ウェット CI でテンプレートを読み込むためのプログラム コードは次のとおりです:
コードをコピーします コードは次のとおりです:
/*
* 出力をバッファリングします
*
* 出力をバッファリングする理由は 2 つあります:
* 1. 速度。大幅な速度向上が得られます。
* 2. 最終的にレンダリングされたテンプレートを出力クラスによって後処理できます
* 。 なぜ
* 後処理が必要なのでしょうか? まず、
* 経過したページ読み込み時間を表示するためです。
* ブラウザに送信される直前にコンテンツをインターセプトして、タイマーを停止できなければ、正確ではありません。
*/
ob_start();
// PHP インストールが短いタグをサポートしていない場合、 'll
// 短いタグを変更して、少し文字列を置換します
// 標準の PHP echo ステートメントに変更します。
if ((bool) @ini_get('short_open_tag') === FALSE AND config_item('rewrite_short_tags') == TRUE)
{
//代替短标记=***>
echo eval('?>'.preg_replace("/;*s*?>/", "; ?>", str_replace('=', ' }
else
{
include($_ci_path); // include() と include_once() では、同じ名前の複数のビューが許可されます
}
//记录调试情報
log_message('debug', 'Fileloaded: '.$_ci_path);
// ファイルデータを返します要求された場合
if ($_ci_return === TRUE)
{
$buffer = ob_get_contents();
@ob_end_clean();
return $buffer;
}
/*
* バッファをフラッシュ... またはフラッシャーをバフします?
*
* ビューを
* 他のビュー内にネストできるようにするには、いつでもコンテンツをフラッシュして戻す必要があります
* 出力バッファリングの最初のレベルを超えているため、
* 適切に表示および含めることができます最初に含まれる
* テンプレートとそれ以降のテンプレートによって。オイ!
*
*/
if (ob_get_level() > $this->_ci_ob_level + 1)
{
ob_end_flush();
}
else
{
// 型板の内容を出流中に追加します
$ _ci_CI->output->append_output(ob_get_contents());
// 消去バッファ
@ob_end_clean();
}
http://www.bkjia.com/PHPjc/327578.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/327578.html技術記事バッファ バッファは 1 つの内部メモリ空間であり、Linux システムで通常認識されるサイズは 4096 (4kb)、つまり 1 つの内部メモリです。