PHP 出力バッファリング あなたはどれくらい知っていますか
1. PHP のキャッシュとは何かについて話しましょう。
PHP では、キャッシュをクライアント キャッシュ (ブラウザ キャッシュ) とサーバー キャッシュ (サーバー キャッシュ) に大別できます。 PHP は B/S アーキテクチャに基づいているため、ブラウザ側のキャッシュとサーバー側のキャッシュとして理解できます。
PHPに付属しているサーバー側のキャッシュは、主に大きく2種類のキャッシュに分けられます!プログラムキャッシュとOBキャッシュ!これはサーバーサイドキャッシュを学ぶためのメインコンテンツでもあります。
PHP でキャッシュされる出力シーケンスは次のとおりです:
PHP 出力キャッシュがオンになります: echo,print -> php Output_buffering -> ブラウザーのバッファリング ->
php 出力キャッシュはオンになっていない: エコー、印刷 -> サーバー バッファリング -> ブラウザ バッファリング -> ブラウザの出力キャッシュ: IE は 256 バイト、Chrome と FireFox は 1000 バイト、出力データのみがこの長さに達しないとスクリプトが終了します. ページ上にデータを出力します。2. サーバー側の応答プロセス
A. クライアントはサーバーにリクエスト応答を送信します。
B. Apache サーバーは PHP モジュールをロードし、対応するプロセス (またはスレッド) を開始し、対応する PHP スクリプト ページを実行します。
C. OB キャッシュがオンになっていない場合、すべての実行結果はプログラム キャッシュに配置され、パッケージ化されてブラウザーに送信されます。ブラウザはページをレンダリングし、最後に見た WEB ページを生成します。D. OB キャッシュがオンになっている場合、実行結果は OB キャッシュとプログラム キャッシュにそれぞれ格納され、プログラムが最後の行まで実行されると、OB キャッシュ内のデータがプログラム キャッシュにフラッシュされます。 . それをパッケージ化してブラウザに返します。ブラウザはページをレンダリングし、私たちが見ている WEB ページを生成します。
3. OB キャッシュの一般的な使用法!
for($i=0; $i<5; $i++){ echo $i.'<br>'; sleep(1); }
動作結果: データが 1 つのバッファーにいっぱいではないため、すべてのスクリプトが完了した後でのみ出力します。
b、output_buffering=4096、出力するデータを少なくします (バッファー 1 つ未満)、output_buffering をオフにします、php.ini の Output_buffering=0 を変更します
echo str_repeat(" ",1024);//这里重复输出一个空白for($i=0; $i<5; $i++){ echo $i."<br/>"; flush(); sleep(1); }
実行結果: OB が無効になっているため、次の操作を行う必要はありませんスクリプトを待ちます。操作が完了した後に出力できます。データは OB に残らず、断続的な出力が表示されます。 echo ->ブラウザ バッファリング -> ブラウザ表示
c、output_buffering=4096、より大きなデータ (1 つのバッファより大きい) を出力、ob_start() を使用しないでください
for($i=0; $i<5; $i++){ echo file_get_contents('f.txt').$i.'<br/><br/><br/><br/>'; sleep(2); }
実行結果: f.txt はより大きい 4kb ファイルはデフォルトのバッファ値より大きく、バッファ容量が十分ではありません。バッファがいっぱいになるたびに出力されるため、断続的な出力が見られます。
d、output_buffering=4096、より大きなデータ (1 つのバッファより大きい) を出力、ob_start() を使用します
ob_start(); for($i=0; $i<5; $i++){ echo file_get_contents('f.txt').$i.'<br/><br/><br/><br/>'; sleep(2); }
実行結果: ob_start() が使用されるため、十分な大きさのスペースがバッファに設定されます。スクリプトが実行されるまで保存され、出力されません。
e、output_buffering=On、ob_start() を使用します
ob_start(); echo "abc-";header("content-type:text/html;charset=utf-8");echo "hello-";ob_end_flush();echo "aa-";echo ob_get_contents();
実行結果: abc-hello-aa-abc-hello-aa-
f、output_buffering=Off、ob_start() を使用します
ob_start(); echo "abc-";header("content-type:text/html;charset=utf-8");echo "hello-";ob_end_flush();echo "aa-";echo ob_get_contents();
実行結果: abc-hello-aa-
出力バッファはスタック可能です。つまり、1 つの ob_start() がアクティブなときに、別の ob_start() を呼び出すことができます。 ob_end_flush() を正しい回数だけ呼び出すようにしてください。複数の出力コールバック関数がアクティブな場合、出力コンテンツは常にネストされた順序でフィルター処理されます。
注: PHP5.2 では OB はデフォルトでオフになっており、5.3 以降ではデフォルトでオンになっています。一時的に PHP バッファリング領域に書き込まれるのではなく、ブラウザに直接出力されなくなります。スクリプトの実行が完了するまで送信されません。
2.ob_get_contentsphp バッファリングでデータを取得します。 注: ob_end_clean() の前に呼び出す必要があります。そうしないと、空の文字のみが取得されます。 3.ob_end_flush と ob_end_clean
ob_end_flush は、PHP バッファリング内のデータを出力しますが、クリアしません。ob_end_clean は出力せず、php バッファリング内のデータをクリアするだけです。
4.ob_flush、flush、ob_implicit_flush
ob_flush は、php バッファリング内のデータをプログラム キャッシュに更新します
flush は、プログラム キャッシュをブラウザ キャッシュに更新します
ob_implicit_flush は、絶対的 (暗黙的) フラッシュをオンまたはオフにします。絶対的 (暗黙的) フラッシュでは、各出力呼び出しの後にフラッシュ操作が行われるため、flush() への明示的な呼び出しは不要になります
4. OB キャッシュの役割!
OB キャッシュはさまざまな側面で使用されますが、私が知っているのは主に 2 つの側面です。
a. Web サイトを静的にする場合は、OB キャッシュを選択するのが良い選択です。
b. 「警告: ヘッダー情報は変更できません - ヘッダーはすでに送信されています。」というエラーを解決します。
エラーの理由: 応答ヘッダーと対応する本文の不整合が原因です。通常の状況では、サーバーからブラウザに返される対応するコンテンツは、応答ヘッダー + 応答本文となるはずです。
ただし、OB キャッシュを有効にすると、対応するヘッダー情報 (通常は header() 関数によって設定された情報) がプログラム キャッシュに配置されます。
他の出力コンテンツ (echo print_r var_dump など) は、最初に OB キャッシュに入れられます。
プログラムが終了するか、OB キャッシュが閉じたら、OB キャッシュの内容をプログラム キャッシュに入れます。これにより、応答ヘッダー情報が常に応答本文の内容よりも前に配置されるようになります。
5. 参考文献:
http://segmentfault.com/a/1190000000578885
http://php.net

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック

Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

Laravelのサービスコンテナとサービスプロバイダーは、そのアーキテクチャの基本です。 この記事では、サービスコンテナ、詳細サービスプロバイダーの作成、登録、および実用的な使用法を例で説明します。 Oveから始めます

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

PHPロギングは、Webアプリケーションの監視とデバッグ、および重要なイベント、エラー、ランタイムの動作をキャプチャするために不可欠です。システムのパフォーマンスに関する貴重な洞察を提供し、問題の特定に役立ち、より速いトラブルシューティングをサポートします

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。
