ホームページ >php教程 >php手册 >PHP出力キャッシュの詳しい説明

PHP出力キャッシュの詳しい説明

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBオリジナル
2016-06-13 12:23:26863ブラウズ

出力制御関数は、header() または setcookie() を使用して送信されるファイル ヘッダー情報には影響せず、echo() および PHP コードと同様のデータ ブロックにのみ影響します。
出力制御の一般的な印象を皆さんに伝えるために、最初に簡単な例を示します。
例 1.

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


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


1. 関連関数の紹介:
1. フラッシュ: バッファーの内容を更新して出力します。 関数の形式: flash()
説明: この関数は頻繁に使用され、非常に効率的です。

2. ob_start: 出力バッファをオープンします
関数形式: void ob_start(void) 説明: バッファがアクティブになると、PHP プログラムからのファイル以外のヘッダー情報がすべて表示されます。送信されませんが、内部バッファに保存されます。バッファの内容を出力するには、ob_end_flush() または flash() を使用してバッファの内容を出力します。

3. ob_get_contents: 内部バッファの内容を返します。
使用法: string ob_get_contents(void) 説明: この関数は、出力バッファーがアクティブ化されていない場合、FALSE を返します。

4. ob_get_length: 内部バッファーの長さを返します。
使用法: int ob_get_length(void) 説明: この関数は、出力バッファーがアクティブ化されていない場合、ob_get_contents と同じように現在のバッファーの長さを返します。その後、FALSE を返します。

5. ob_end_flush: 内部バッファの内容をブラウザに送信し、出力バッファを閉じます。
使用法: void ob_end_flush(void) 説明: この関数は、出力バッファーの内容 (存在する場合) を送信します。

6. ob_end_clean: 内部バッファの内容を削除し、内部バッファを閉じる
使用法: void ob_end_clean(void) 注: この関数は内部バッファの内容を出力しません。削除してください!

7. ob_implicit_flush: 絶対リフレッシュをオンまたはオフにする
使用法: void ob_implicit_flush ([int flag]) 注: Perl を使用したことがある人なら、$|=x の意味を知っています。 、この文字列はバッファをオープン/クローズすることができ、ob_implicit_flush 関数はそれと同じであり、絶対出力をオンにした後、各スクリプト出力はブラウザに直接送信されます。 call flash()

2. 詳細な理解:
1. Flush 関数について: この関数は、PHP3 で登場した非常に便利な関数です。
例 2.


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

for($i = 1; $i <= 300; $i ) print(" "); これ文は非常に重要です。キャッシュの構造により、そのコンテンツは一定のサイズに達した場合にのみブラウザから出力できます。
// つまり、キャッシュのコンテンツが一定のサイズに達しない場合、出力されません。プログラムの実行が完了する前。
// テストの結果、このサイズの下限は 256 文字であることがわかりました。これは、今後キャッシュによって受信されるコンテンツが
// 継続的に送信されることを意味します。
For($j = 1; $j <= 20; $j ) {
echo $j.”
”; // これにより、新しいアイテムがキャッシュに追加されます。コンテンツは絞り出されてブラウザに表示されます。
sleep(1); //プログラムを 1 秒間「スリープ」させます。これにより、効果をより明確に確認できるようになります。
}
?>


具体的な効果については、こちらをご覧ください。 http://www.php2000.com/~uchinaboy/out.php
PHP2000 の最新の PHP チャット ルームでは、残念ながら、ソース コードは公開されていません。
注: プログラムの先頭に ob_implicit_flush() を追加して絶対リフレッシュを有効にすると、プログラム内で flash() を使用できなくなります。これによる利点は次のとおりです。効率が向上します。
2. ob シリーズ関数について:
最初に私の友人 y10k の例を引用したいと思います:
例 3.
たとえば、サーバーとクライアントの設定情報ですが、この情報はクライアントによって異なります。phpinfo() 関数の出力を保存したい場合はどうすればよいでしょうか。バッファ制御がなかった前は、まったく解決策がなかったと言えますが、バッファ制御を使用すると、簡単に解決できます:

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


ob_start(); //バッファを開きます
phpinfo() //phpinfo 関数を使用します
$info= ob_get_contents(); // バッファの内容を取得し、$info に代入します
$file=fopen('info.txt','w'); // ファイル info.txt を開きます
fwrite( $file,$info); // info.txt に情報を書き込みます
fclose($file); // ファイル info.txt を閉じます


上記の方法を使用すると、以前は不可能だったかもしれないさまざまなユーザーの phpinfo 情報を保存できます。実は上記は一部の「処理」を「関数」に変換する方法なのです!
「これはただのことですか? 他に用途はありますか?」と疑問に思う人もいるかもしれません。もちろん、たとえば、作者のフォーラムにある PHP の構文ハイライトがこれに関連しています (PHP のデフォルトの構文ハイライト機能は、直接出力する場合、結果を保存できません。呼び出すたびに表示されると CPU の無駄になります。興味のある方は、構文強調表示機能で表示された結果をバッファに保存してください。 http://www.zphp.com/bbs/ をご覧ください。
おそらく、ob_start() の関数をある程度理解できたのではないでしょうか。上の例は単純に見えますが、実際には、ob_start() の使用の重要なポイントをマスターしたことになります。
<1>。ob_start を使用してブラウザのキャッシュを開きます。これにより、flush()、ob_end_flush() を呼び出す前 (またはプログラムが実行される前) にキャッシュの内容が出力されなくなります。
<2> これで、出力コンテンツの後にヘッダー、setcookie、セッションを使用できることがわかりました。これは、ob_start の優れた機能です。また、キャッシュ内の ob_start のパラメーターも使用できます。これを記述すると、ob_start("ob_gzhandler"); などのコマンドが自動的に実行されます。最も一般的なアプローチは、ob_get_contents() を使用してキャッシュの内容を取得し、それを処理することです。
<3>処理後は、flush()、ob_end_flush()、プログラム実行後の自動出力など、さまざまなメソッドを使用して出力できます。もちろん、ob_get_contents() を使用している場合は、出力メソッドを自分で制御する必要があります。
さあ、ob シリーズの関数で何ができるか見てみましょう...
1. 静的テンプレート技術
はじめに: いわゆる静的テンプレート技術は、ユーザーがクライアント側で取得するのは、PHP によって生成された HTML ページです。この HTML ページが更新されなくなると、別のユーザーがこのページを再度閲覧したときに、sina、163、sohu などの大量の情報を含む一部の Web サイトでは、プログラムが PHP および関連データベースを呼び出すことはなくなります。このようなテクノロジーの恩恵は非常に大きいです。
私は静的出力を実現する 2 つの方法を知っています:
<1>。y10k によって修正された phplib の template.inc.php というクラスを通じて実装されます。
. ob シリーズ関数を使用して実装します。
最初の方法については、この記事で検討する問題ではないため、詳細は説明しません。
2 番目のメソッドの具体的な実装を見てみましょう:
例 4.
ob_start();//バッファを開きます
?> <🎜; >PHP ページのすべての出力
$content = ob_get_contents();//PHP ページのすべてのコンテンツ出力を取得します
$fp = fopen(“output00001.html”, “w ”); //ファイルを作成し、書き込み用に開きます。
fwrite($fp, $content); //php ページのすべてのコンテンツを output00001.html に書き込みます。
fclose( $fp);
?>
このようにして、いわゆる静的テンプレートを簡単に実装できます...
2. 出力のキャプチャ
上記の例 4. は最も単純なケースです。書き込む前に $content を操作することもできます...
例 3 で説明した PHP 構文の強調表示など、いくつかのキーワードを取得して再処理することもできます。個人的には、この関数がさまざまな問題を解決できる最も優れた部分だと思いますが、十分な想像力が必要です...
例 5.

関数 run_code? ($code) {
If($code) {
ob_start();
$contents = ob_get_contents(); }else {
echo "エラー! 出力がありません";
exit();
return $contents;
上記の例はあまり役に立ちません。非常に便利です。典型的な $code 自体は変数を含む出力ページです。この例では、eval を使用して $code 内の変数を置き換え、出力結果を再度取得して処理します。
例 6. 速度送信
/*
** タイトル....: PHP4 HTTP 圧縮による Web の高速化
** バージョン....: 1.20
** 作成者....: catoc
** ファイル名....: gzdoc.php
** 最終変更日..: 18 /10/2000
** 要件...: PHP4 >= 4.0.1
** PHP は --with-zlib[=DIR] で構成されました
** 注.... ....:ダイナミック コンテンツ アクセラレーションは、
** オンザフライでデータ送信データを圧縮します
** コード (Sun jin hu (catoc)
** 1998/1999 以降のほとんどのブラウザでは、
** は、「コンテンツ エンコーディング」として知られる HTTP 1.1
** 標準をサポートするように装備されています。
** 本質的に、ブラウザは、「コンテンツ エンコーディング」を受け入れることができることを
** サーバーに示します。 "
** サーバーが対応していれば、
** データを圧縮して送信します。
** ブラウザーはそれを解凍し、ページを
** レンダリングします。
**
** John Lim (jlim@natsoft.com.my) によって修正
** Sandy McArthur, Jr のアイデアに基づいて
** 使用法… ..:
** スペースなし最初の '** ------------ ファイルの開始 ------- ---
** ;?
** | include('gzdoc.php');
** |
* |... ページ
** |
** |
** |? -------ファイルの終わり----------
*/
ob_start();
ob_implicit_flush(0) ;
関数 CheckCanGzip(){
global $HTTP_ACCEPT_ENCODING;
if (headers_sent() || connection_timeout() || connection_aborted()){
return 0;
}
if (strpos($HTTP_ACCEPT_ENCODING, 'x-gzip' ) !== false) return "x-gzip";
if (strpos($HTTP_ACCEPT_ENCODING,'gzip') !== false) return
return
}
/* $level = 圧縮レベル 0 ~ 9、0=なし、9=最大 */
function GzDocOut($level=1,$debug=0){
$ENCODING = CheckCanGzip(); if ($ENCODING){
print "nn";
ob_end_clean(); debug){
$s = "

長さを圧縮しません: ".strlen($Contents);
$s .= "
圧縮された長さ : ".strlen(gzcompress($Contents,$)レベル));
$Contents .= $s;
}
print "x1fx8bx08x00x00x00x00 ";コンテンツ);
$Crc = crc32($Contents);
$Contents = gzcompress($Contents,$level);
$Contents = substr($Contents, 0, strlen($Contents) - 4 );
print $Contents;
print Pack('V',$Size);
exit; >ob_end_flush();
exit;
}
}
?>
これは catoc の非常に古いコードで、彼は zlib の関数を使用しました。送信されたコンテンツを圧縮すると、その効果は 10,000 ページを超えるページで発生することがわかり、ページが大きくなるほど、その効果はより顕著になります。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。