ホームページ > php教程 > php手册 > PHP の ob_start() を使用してブラウザのキャッシュを制御します。

PHP の ob_start() を使用してブラウザのキャッシュを制御します。

WBOY
リリース: 2016-06-13 12:36:40
オリジナル
896 人が閲覧しました

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

出力制御の一般的な印象を与える簡単な例を示します。
例 1.

CODEob_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 の意味を知っており、この文字列は変更できます。 on /Close はバッファーを閉じます。ob_implicit_flush 関数はそれと同じです。デフォルトでは、絶対出力をオンにした後、各スクリプト出力がブラウザーに直接送信され、flush() を呼び出す必要はありません。


2. 詳しい理解:

1. Flush 関数について:
この関数は、非常に便利な関数です。
例 2.

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

ここで具体的な効果を確認できます [url]http://www.php2000.com/~uchinaboy/out.php[/url]
PHP2000 の最新 PHP チャット ルーム このテクノロジーはL
注: 絶対リフレッシュを有効にするためにプログラムの先頭に ob_implicit_flush() を追加すると、プログラム内で flash() を使用できなくなります。それは次のとおりです: 効率を向上させます!

2. ob シリーズ関数について:
最初に私の友人 y10k の例を引用したいと思います:
例 3.

たとえば、サーバーとクライアントの設定情報ですが、この情報はクライアントによって異なります。phpinfo() 関数の出力を保存したい場合はどうすればよいでしょうか。バッファ制御がなかった前は、まったく方法がなかったと言えますが、バッファ制御を使用すると、それを簡単に解決できます。
CODEob_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 の無駄になります。興味のある方は、構文強調表示機能で表示された結果をバッファに保存してください。 [url]http://www.zphp.com/bbs/[/url]をご覧ください。

おそらく、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 つの方法を知っています:
。y10k によって変更された phplib の template.inc.php というクラスを介して実装されます。
. ob シリーズ関数を使用して実装します。
最初の方法については、この記事で検討する問題ではないため、詳細は説明しません。
2 番目のメソッドの具体的な実装を見てみましょう:
例 4.


CODEob_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.

CODE関数 run_code($code) {
If($code) {
ob_start()
eval($code);
$contents = ob_get_contents();
}else {
echo "エラー! 出力がありません";
exit();
return $contents;


この例はあまり役に立ちませんが、$code 自体が変数を含む出力ページであることは非常に一般的であり、この例では eval を使用して $code 内の変数を置き換え、出力結果をキャプチャして再度処理します。

例 6. 転送の高速化


CODE/*
** タイトル.....: PHP4 HTTP圧縮により Web が高速化
** バージョン....: 1.20
** 著者....: catoc <[email]catoc@163.net[/email]> ** ファイル名...: gzdoc.php
** 最終変更日...: 18/10/2000
** 要件...: PHP4 >= 4.0.1
** PHP は構成されましたwith --with-zlib[=DIR]
** 注...: 動的コンテンツ アクセラレーションは、
** オンザフライでデータ送信データを圧縮します
** sun jin hu (catoc) によるコード < ;[email]catoc@163.net[/email]>
** 1998/1999 年以降のほとんどの新しいブラウザには、「コンテンツ」として知られる HTTP 1.1
** 標準をサポートする機能が搭載されています。 -encoding."
** 基本的に、ブラウザは
** サーバーに「コンテンツ エンコーディング」
** を受け入れることができることを示し、サーバーが対応できる場合は
** 圧縮します。
** ブラウザはそれを解凍し、
** ページをレンダリングします。
**
** John Lim ([email]jlim@natsoft.com. my[/email])
** Sandy McArthur, Jr のアイデアに基づく
** 使用法....:
** 最初の '** ------------ ファイルの開始-----
** ** |
** |... ページ ..
** | 🎜>** |
** |?
** ----- --------ファイルの終わり---------
*/
ob_start();
ob_implicit_flush(0);
global $HTTP_ACCEPT_ENCODING
if (headers_sent) () || connection_timeout() || connection_aborted()){
return 0;
}
if (strpos($HTTP_ACCEPT_ENCODING, 'x-gzip') !== false) return " ";
if (strpos($HTTP_ACCEPT_ENCODING,'gzip') !== false) return "gzip";
return 0;
}
/* $level = 圧縮レベル 0-9, 0=なし、9=最大 */
function GzDocOut($level=1,$debug=0){
$ENCODING = CheckCanGzip();
if ($ENCODING){
print " nn";
$Contents = ob_get_contents();
ob_end_clean();
if ($debug){
$s = "< ;p>非圧縮の長さ: ".strlen($Contents);
$s .= "
圧縮された長さ: ".strlen(gzcompress($Contents ,$level));
$Contents .= $s;
}
header("コンテンツエンコーディング: $ENCODING");
$Size = strlen ($Contents); $Contents);
$Contents($Contents,$level);
$Contents = substr($Contents, 0, strlen($Contents) - 4); >print パック('V',$Crc);
print パック('V',$Size);
}else{
ob_end_flush(); 🎜>}
}
?>

これは、weblogs.com で見た、かな​​り昔の catoc のコードです。はい、送信されたコンテンツを圧縮するために zlib の機能を使用していました。テストでは、10,000 ページを超えるページで効果が生じることが示され、ページが大きくなるほど、その効果はより明らかになります...

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート