ホームページ > バックエンド開発 > PHPチュートリアル > PHP の ob_start() を使用してブラウザのキャッシュを制御します!_PHP チュートリアル

PHP の ob_start() を使用してブラウザのキャッシュを制御します!_PHP チュートリアル

WBOY
リリース: 2016-07-21 16:00:50
オリジナル
972 人が閲覧しました

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

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

CODEob_start(); //バッファを開きます
echo "Hellon" //Output
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)
説明: この関数は、出力バッファがアクティブ化されていない場合、現在のバッファの内容を返します。
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 関数はこれと同じです。デフォルトでは、絶対出力をオンにした後、各スクリプト出力がブラウザーに直接送信され、


2 を呼び出す必要はありません。詳しい理解:

1. フラッシュ関数について:
この関数は、ブラウザのキャッシュを更新する非常に便利な関数です。
例 2.

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


具体的な効果を確認するには、ここにアクセスしてください。 url] http://www.php2000.com/~uchinaboy/out.php[/url]
PHP2000の最新PHPチャットルームではこの技術が使われていますが、残念ながらソースコードは公開されていませんL
注:先頭にある場合ob_implicit_flush() を追加して絶対フラッシュをオンにすることにより、プログラム内でフラッシュ() を使用できなくなります。これにより、効率が向上します。

2. ob シリーズの機能について:
まずは私の友人 y10k の例を引用したいと思います:
例 3.

たとえば、サーバーとクライアントの設定情報を使用できますが、この情報はクライアントによって異なりますが、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 つの方法があります:
<1>。y10k によって修正された phplib の template.inc.php というクラスを通じて実装されます。
<2>. 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.

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


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

例 6. 送信を高速化します


CODE/*
** Title....: PHP4 HTTP Compression Speedsウェブにアップします
** バージョン....: 1.20
** 作者....: catoc <[email]catoc@163.net[/email]>
** ファイル名 .... .: gzdoc.php
** 最終変更日..: 2000/10/18
** 要件...: PHP4 >= 4.0.1
** PHP は --with-zlib[ =DIR] で構成されました
** 注...: ダイナミック コンテンツ アクセラレーションは、
** データ送信データをオンザフライで圧縮します
** (Sun jin hu (catoc) <[email]catoc@163 .net[/email]>)
* * 1998/1999 年以降のほとんどの新しいブラウザーには、「コンテンツ エンコーディング」として知られる HTTP 1.1
** 標準をサポートする機能が搭載されています。
** 本質的に、ブラウザーは「コンテンツ」を受け入れることができることを
** サーバーに示します。エンコーディング"
** を実行し、サーバーが対応している場合は、データを
** 圧縮して送信します。
** ブラウザはそれを解凍し、ページを
** レンダリングします。
**
** John Lim によって変更されました([email]jlim@natsoft.com.my[/email])
** Sandy McArthur, Jr のアイデアに基づく
** 使用法....:
**最初の '< の先頭の前にスペースは入れません;?' タグ。
**----------ファイルの先頭----------
** | ');
** |
** |
** | gzdocout();
** |? >
**----------ファイルの終わり----------
*/
ob_implicit_flush (0);
関数 CheckCanGzip(){
グローバル $HTTP_ACCEPT_ENCODING;
if (headers_sent() || connection_timeout() || connection_aborted()){
return
}
if (strpos($HTTP_ACCEPT_ENCODING, 'x- gzip') !== false) return "x-gzip";
if (strpos($HTTP_ACCEPT_ENCODING,'gzip') !== false) return 0;レベル 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 = "

圧縮されていない長さ: ".strlen( $Contents);
$s .= "
圧縮された長さ: ".strlen(gzcompress($Contents,$level));
$Contents .= $s;
header("Content-Encoding: $ENCODING") ;
$Size = strlen($Contents);
$Contents = gzcompress($Contents, $level); , strlen($Contents) - 4);
print $Contents;
print Pack('V',$ Size);
ob_end_flush() ;
exit;
}
}
?> これは、weblogs.com で見た、catoc のコードです。テストでは、送信されたコンテンツが圧縮されることがわかりました。この問題は 10,000 ページを超えるページで発生し、ページが大きくなればなるほど、その影響はより顕著になります...

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/317035.html技術記事 OutputControl 関数を使用すると、スクリプト内のデータの出力を自由に制御できます。特にデータ出力後にファイルヘッダーを出力したい場合に非常に便利です。出力制御...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート