ホームページ  >  記事  >  バックエンド開発  >  PHP出力キャッシュobシリーズの機能を詳しく解説_PHPチュートリアル

PHP出力キャッシュobシリーズの機能を詳しく解説_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:36:17822ブラウズ

ob の基本原理: ob キャッシュがオンになっている場合、エコー データは最初に ob キャッシュに配置されます。ヘッダー情報の場合は、プログラム キャッシュに直接配置されます。ページが最後まで実行されると、ob キャッシュされたデータがプログラム キャッシュに配置され、順番にブラウザに返されます。
ob の基本的な機能についてお話しましょう:
1) setcookie()、header()、または session_start() などの関数を使用して、ブラウザーが出力した後にヘッダー ファイルを送信することによって引き起こされるエラーを防ぎます。実際、この種の使用頻度を減らし、適切なコーディング習慣を身に付ける方が良いでしょう。
2) 取得できない関数の出力をキャプチャします。たとえば、phpinfo() は大量の HTML を出力しますが、この時点では、ob は $info=phpinfo(); のような変数を使用できません。役に立つ。
3) gzip 圧縮、簡体字中国語から繁体字中国語への変換、文字列の置換など、出力コンテンツを処理します。
4) 静的ファイルの生成では、実際にはページ全体の出力をキャプチャし、それをファイルとして保存します。 HTML 生成またはページ全体のキャッシュでよく使用されます。

3 番目の GZIP 圧縮については、使いたいと思っていても実際には使ったことがない人も多いかもしれませんが、コードを少し変更するだけで、ページの gzip 圧縮を実現できます。

コードをコピーします コードは次のとおりです:
ob_start(ob_gzhandler);
キャッシュされるコンテンツ

はい、コールバック関数 ob_gzhandler を追加するだけですが、これにはいくつかの小さな問題があります。 zlib のサポートが必要です。第二に、ブラウザが gzip をサポートしているかどうかは判断されません (現在はサポートされているようで、すべての iPhone ブラウザが gzip をサポートしているようです)。
以前のアプローチは、ブラウザーが gzip をサポートしているかどうかを判断し、サードパーティの gzip 関数を使用して ob_get_contents() のコンテンツを圧縮し、最後にエコーするというものでした。

1. obシリーズの関数でよく使われる関数のコレクション

コードをコピーします コードは次のとおりです:

ob_start(); //出力バッファを開きます。すべての出力情報はブラウザに直接送信されなくなり、出力バッファに保存されます。

ob_clean(); //バッファを閉じずに内部バッファの内容を削除します(出力なし)。
ob_end_clean(); //内部バッファの内容を削除し、バッファを閉じます(出力なし)。
ob_g​​et_clean(); //内部バッファの内容を返し、バッファを閉じます。 ob_get_contents() および ob_end_clean() の実行と同等
ob_flush(); // 内部バッファの内容をブラウザに送信し、バッファの内容を削除し、バッファを閉じません。
ob_end_flush(); //内部バッファの内容をブラウザに送信し、バッファの内容を削除して、バッファを閉じます。
ob_g​​et_flush(); //内部バッファの内容を返し、バッファを閉じてから、バッファの内容を解放します。 ob_end_flush() と同等で、バッファの内容を返します。
flush(); //ob_flush で解放した内容と PHP バッファにない内容をブラウザに出力し、内部バッファの内容を更新して出力します。

ob_g​​et_contents(); // 出力せずにバッファーの内容を返します。
ob_g​​et_length(); // 内部バッファーがアクティブ化されていない場合、この関数は FALSE を返します。
ob_g​​et_level(); //出力バッファリングメカニズムのネストレベルを返します。
ob_g​​et_status(); //出力バッファのステータスを取得します。

ob_implicit_flush(); //絶対リフレッシュをオンまたはオフにします。デフォルトは、ob_implicit_flush(true) をオンにした後、出力ステートメント (例: echo) が実行されることを意味します。これは、flush() を呼び出したり、スクリプトの出力が終了するまで待機したりする代わりに、ブラウザに直接送信されます。

ob_g​​zhandler //ob_start コールバック関数は、gzip を使用してバッファーの内容を圧縮します。

ob_list_handlers //使用中のすべての出力ハンドラーをリストします
output_add_rewrite_var //URL リライター値を追加します
output_reset_rewrite_vars //URL リライター値をリセットします

これらの関数の動作は php_ini 設定の影響を受けます:

output_buffering //この値が ON の場合、出力制御がすべてのスクリプトで使用されます。値が数値の場合、バッファーの最大バイト制限を表します。コンテンツのキャッシュ 上限に達すると、現在のバッファの内容がブラウザに自動的に出力されます。
output_handler //このオプションは、スクリプトのすべての出力を関数にリダイレクトできます。たとえば、output_handler が mb_output_handler() に設定されている場合、文字のエンコーディングは指定されたエンコーディングに変更されます。設定された処理関数は出力バッファリングを自動的に処理します。
implicit_flush //ob_implicit_flush と同じ機能、デフォルトはオフです。

2. 例の説明

1. header()関数の前にechoコードが存在する可能性があります
出力制御関数を使用すると、スクリプト内のデータの出力を自由に制御できます。特にデータ出力後にファイルヘッダーを出力したい場合に非常に便利です。
出力制御関数は、header() または setcookie() を使用して送信されるファイル ヘッダー情報には影響しませんが、echo() や PHP コードと同様のデータ ブロックにのみ影響します。

コードをコピーします コードは次のとおりです:
ob_start(); // バッファを開き、index.php へ
ob_end_flush() // すべてのコンテンツをブラウザに出力します
;header() 関数を知っている人なら誰でも、この関数がブラウザにファイル ヘッダーを送信することを知っていますが、この関数を使用する前に出力がある場合 (スペース、キャリッジ リターン、ライン フィードなどの空の出力を含む)、エラーが発生します。プロンプトが表示されます。最初の行の ob_start() を削除してこのプログラムを実行すると、次のエラー メッセージが表示されることがわかります。「ヘッダーはすべて送信準備ができました。」ただし、ob_start を使用すると、エラー メッセージは表示されません。その理由は、バッファーが開かれたときに、echo 以降の文字がブラウザーに出力されず、flush を使用するまでサーバー上に出力されないためです。または ob_end_flush なので、ファイル ヘッダー出力エラーは発生しません。

2. phpinfo() 関数の出力を保存します
コードをコピーします コードは次のとおりです:
ob_start() //phpinfo 関数を使用します
$info = ob_get_contents( );バッファの内容を取得して $info に代入します
$file = fopen('info.txt', 'w') //ファイル info.txt を開きます
fwrite($file, $info); info.txt
fclose($file); PHP によって生成された HTML ページ。この HTML ページが更新されなくなると、別のユーザーがこのページを再度参照したときに、プログラムは、sina、163、sohu などの大量の情報を含む一部の Web サイトの PHP および関連データベースを呼び出すことはなくなります。このようなテクノロジーの恩恵は非常に大きいです。


コードをコピーします
コードは次のとおりです:

ob_start();
$fp = fopen ("output00001.html", "w"); // ファイルを作成し、開き、準備をします。 write fwrite($fp, $content); //php ページのすべてのコンテンツを Output00001.html に書き込み、その後... fclose($fp);
3. 出力キャッシュ ハンドル ob_gzhandler

PHP4.0.4 には新しい出力キャッシュ ハンドル ob_gzhandler があり、前のクラスに似ていますが、その使用法は異なります。 ob_gzhandler を使用する場合、以下が php.ini に追加されます:



コードをコピーします

コードは次のとおりです: output_handler = ob_gzhandler;

このコード行により、PHP は出力キャッシュをアクティブにし、送信するすべてのものを圧縮します。外 。
何らかの理由でこのコード行を php.ini に追加したくない場合は、PHP ソース ファイルが配置されているディレクトリ内の .htaccess ファイルを使用して、デフォルトのサーバー動作 (非圧縮) を変更することもできます。構文は次のとおりです:
コードをコピー
コードは次のとおりです:
php_value Output_handler ob_gzhandler


または、次のように PHP コードから呼び出します:

コードをコピーします
コードは次のとおりです:

ob_start("ob_gzhandler");
キャッシュ ハンドルを出力する方法は確かに非常に効果的であり、サーバーに特別な負荷をかけません。ただし、Netscape Communicator では圧縮グラフィックのサポートが不十分であるため、すべてのユーザーが IE ブラウザを使用していることを保証できない限り、圧縮 JPEG および GIF グラフィックを無効にする必要があることに注意してください。一般に、この圧縮は他のすべてのファイルに対して機能しますが、特に特別なプラグインやデータ ビューアを使用する場合は、ブラウザごとに個別にテストすることをお勧めします。
注:
1. 一部の Web サーバーのデフォルトの出力バッファリングは 4069 文字以上です。つまり、フラッシュが確実に効果的であるようにするには、出力コンテンツが 4069 文字に達する必要があります。 ob_flush() 関数の前に置くのが最適です。次のステートメントがあります:
コードをコピーする コードは次のとおりです:
print str_repeat("", 4096) //output_buffering 値が確実に到達

2. ob_* 系の関数は PHP 自体の出力バッファを操作するため、ob_flush は PHP 自体のバッファを更新するだけですが、flush は Apache のバッファを更新します。したがって、この 2 つを使用する正しい順序は、最初に ob_flush、次にフラッシュです。 ob_flush は PHP のバッファからデータを解放し、flush はバッファに出入りするすべてのデータをブラウザに送信します。
3. ob_start() を使用した後は、スクリプトの echo/print やその他の出力がブラウザーに表示されないと誤解しないでください。 PHP スクリプトが終了すると、バッファが自動的に更新され、内容が出力されるためです。

www.bkjia.com本当http://www.bkjia.com/PHPjc/740209.html技術記事 ob の基本原理: ob キャッシュがオンになっている場合、エコー データは最初に ob キャッシュに配置されます。ヘッダー情報の場合は、プログラム キャッシュに直接配置されます。ページが最後まで実行されると、ob キャッシュされたデータは...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。