ホームページ バックエンド開発 PHPチュートリアル PHPバッファの使い方の詳しい説明output_buffering_PHPチュートリアル

PHPバッファの使い方の詳しい説明output_buffering_PHPチュートリアル

Jul 21, 2016 pm 03:07 PM
buffer linux output php 使用 メモリ 住所 はい 空間 バッファ 詳しい説明

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_g​​et_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.comtru​​ehttp://www.bkjia.com/PHPjc/327578.html技術記事バッファ バッファは 1 つの内部メモリ空間であり、Linux システムで通常認識されるサイズは 4096 (4kb)、つまり 1 つの内部メモリです。
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

Deepseek Webバージョンの入り口Deepseek公式ウェブサイトの入り口 Deepseek Webバージョンの入り口Deepseek公式ウェブサイトの入り口 Feb 19, 2025 pm 04:54 PM

DeepSeekは、Webバージョンと公式Webサイトの2つのアクセス方法を提供する強力なインテリジェント検索および分析ツールです。 Webバージョンは便利で効率的であり、公式ウェブサイトは包括的な製品情報、ダウンロードリソース、サポートサービスを提供できます。個人であろうと企業ユーザーであろうと、DeepSeekを通じて大規模なデータを簡単に取得および分析して、仕事の効率を向上させ、意思決定を支援し、イノベーションを促進することができます。

DeepSeekをインストールする方法 DeepSeekをインストールする方法 Feb 19, 2025 pm 05:48 PM

DeepSeekをインストールするには、Dockerコンテナ(最も便利な場合は、互換性について心配する必要はありません)を使用して、事前コンパイルパッケージ(Windowsユーザー向け)を使用してソースからコンパイル(経験豊富な開発者向け)を含む多くの方法があります。公式文書は慎重に文書化され、不必要なトラブルを避けるために完全に準備します。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

Bitget公式ウェブサイトのインストール(2025初心者ガイド) Bitget公式ウェブサイトのインストール(2025初心者ガイド) Feb 21, 2025 pm 08:42 PM

Bitgetは、スポット取引、契約取引、デリバティブなど、さまざまな取引サービスを提供する暗号通貨交換です。 2018年に設立されたこのExchangeは、シンガポールに本社を置き、安全で信頼性の高い取引プラットフォームをユーザーに提供することに取り組んでいます。 Bitgetは、BTC/USDT、ETH/USDT、XRP/USDTなど、さまざまな取引ペアを提供しています。さらに、この取引所はセキュリティと流動性について評判があり、プレミアム注文タイプ、レバレッジド取引、24時間年中無休のカスタマーサポートなど、さまざまな機能を提供します。

OUYI OKXインストールパッケージが直接含まれています OUYI OKXインストールパッケージが直接含まれています Feb 21, 2025 pm 08:00 PM

世界をリードするデジタル資産交換であるOuyi Okxは、安全で便利な取引体験を提供するために、公式のインストールパッケージを開始しました。 OUYIのOKXインストールパッケージは、ブラウザに直接インストールでき、ユーザー向けの安定した効率的な取引プラットフォームを作成できます。インストールプロセスは、簡単で理解しやすいです。

See all articles