ホームページ  >  記事  >  バックエンド開発  >  PHP ob_start() を使用してブラウザのキャッシュを制御し、HTML 実装コードを生成する_PHP チュートリアル

PHP ob_start() を使用してブラウザのキャッシュを制御し、HTML 実装コードを生成する_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:40:52891ブラウズ

出力制御関数は、header() または setcookie() を使用して送信されるファイル ヘッダー情報には影響せず、echo() および PHP コードと同様のデータ ブロックにのみ影響します。

出力制御の一般的な印象を与えるために、まず簡単な例を見てみましょう:
例 1.
PHP コード

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

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()またはflush()を使用してバッファの内容を出力できます。
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 関数もそれと同じです。デフォルトでは、絶対出力をオンにした後、各スクリプト出力がブラウザに直接送信され、flush() を呼び出す必要はありません。
2. 詳細な理解:
1. フラッシュ関数について: この関数は、ブラウザのキャッシュを更新する非常に便利な関数です。フラッシュを説明するための非常に明白な効果を持つ例
例 2.
PHP コード

コードをコピーします コードは次のとおりです:
// この文は非常に重要です。キャッシュの構造により、そのコンテンツは一定のサイズに達した場合にのみブラウザから出力されます。つまり、キャッシュの内容が一定のサイズに達しない場合、プログラムの実行が完了するまで出力されません。
// テストの結果、このサイズの下限は 256 文字であることがわかりました。これは、今後キャッシュによって受信されるコンテンツが
// 継続的に送信されることを意味します。
For($j = 1; $j <= 20; $j++) {
echo $j.”
flush(); // これにより、キャッシュ内の新しいコンテンツが絞り出されて表示されます。ブラウザに移動します
sleep(1); //プログラムを少しの間「スリープ」させます。これにより、効果をより明確に確認できるようになります
}
?>
注: ob_implicit_flush() をプログラムの先頭に追加して絶対リフレッシュを有効にすると、プログラム内で flash() を使用できなくなります。これによる利点は次のとおりです。効率が向上します。
2. ob シリーズの機能について:
最初に私の友人 y10k の例を引用したいと思います:
例 3.
たとえば、サーバーとクライアントの設定情報を使用できますが、この情報はクライアントによって異なりますが、phpinfo() 関数の出力を保存したい場合はどうすればよいでしょうか。バッファ制御がない前はまったく方法がなかったと言えますが、バッファ制御があれば簡単に解決できます:
PHP コード
コードをコピー コードは次のとおりです:

ob_start (); // バッファを開きます
phpinfo(); // phpinfo 関数を使用します
$info=ob_get_contents(); // バッファの内容を $info に割り当てます
$file= fopen('info.txt', 'w'); // ファイル info.txt を開きます
fwrite($file,$info); // info.txt に情報を書き込みます
fclose($file); file info.txt
?>

上記の方法を使用すると、以前は不可能だったかもしれない、さまざまなユーザーの phpinfo 情報を保存できます。実は上記は一部の「処理」を「関数」に変換する方法なのです!
これで、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.
PHP コード
コードをコピー コードは次のとおりです:

ob_start();//バッファを開きます
?>

PHP コードのすべての出力

コードをコピーします コードは次のとおりです:
$content = ob_get_contents();// php ページの内容を出力します
$fp = fopen("output00001.html", "w"); //ファイルを作成して書き込み用に開きます
fwrite($fp, $content); // php ページをoutput00001.htmlにコピーし、その後...
?>


この方法で、いわゆる静的テンプレートを簡単に実装できます...

2.
上記の例 4. は、最も単純なケースでは、書き込む前に $content を操作することもできます... 例 3 で説明した PHP 構文の強調表示など、いくつかのキーワードをキャプチャして再処理してみることもできます。個人的には、この関数がこの関数の最大のエッセンスだと思います。この関数はさまざまな問題を解決できますが、十分な想像力が必要です...
例 5.
PHP コード


コードをコピーしますは次のとおりです:
Function run_code($code) {
ob_start();
$contents = ob_get_contents();
}else {
echo "エラー! 出力がありません"
}
return $contents;

;
上記の例はあまり役に立ちませんが、$code 自体が変数を含む出力ページであることが一般的です。この例では、$code 内の変数を置き換えるために eval が使用され、出力結果が再度取得されます。 ..
例 6. 転送を高速化する
PHP コード
コードをコピー コードは次のとおりです:

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

長さを圧縮しません: ".strlen($Contents) .= "
圧縮された長さ: ".strlen(gzcompress($Contents,$level));コンテンツ .= $s;
header("コンテンツ エンコーディング: $ENCODING");
$Size = strlen($Contents); = gzcompress($Contents,$level);
$Contents = substr($Contents, 0, strlen($Contents) - 4); ('V' 。彼は zlib の機能を使用して、送信されたコンテンツを圧縮しました。テストでは、その効果は 10k を超えるページで生成されることが示され、ページが大きくなればなるほど、その効果はより明白になります...



http://www.bkjia.com/PHPjc/321271.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/321271.html

技術記事

出力制御関数は、header() または setcookie() を使用して送信されるファイル ヘッダー情報には影響しませんが、echo() や PHP コードと同様のデータ ブロックにのみ影響します。 まずは簡単なものからあげましょう...





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