ホームページ php教程 php手册 PHP ob_start() を使用してブラウザのキャッシュを制御し、HTML 実装コードを生成する

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

Jun 13, 2016 pm 12:18 PM
cache head html php start コード 使用 関数 成し遂げる コントロール ブラウザ 生成する 使用 出力

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

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

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


ob_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)
説明: この関数は、出力バッファーがアクティブ化されていない場合、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 関数はそれと同じであり、絶対出力をオンにした後、各スクリプト出力はブラウザに直接送信されます。 flash() を呼び出します。

2. 詳細な理解: 1. Flush 関数について:
この関数は、非常に効率的な関数であり、非常に便利です。ブラウザのキャッシュを更新することです。フラッシュを説明するために、非常に明白な操作効果の例を示します。
PHP コード


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

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


注: プログラムの先頭に ob_implicit_flush() を追加して絶対リフレッシュを有効にすると、プログラム内で flash() を使用できなくなります。これによる利点は次のとおりです。効率が向上します。
2. ob シリーズ関数について:
最初に私の友人 y10k の例を引用したいと思います:
例 3.
たとえば、サーバーとクライアントの設定情報ですが、この情報はクライアントによって異なります。phpinfo() 関数の出力を保存したい場合はどうすればよいでしょうか。バッファ制御がない前はまったく方法がなかったと言えますが、バッファ制御を使用すると、次のように簡単に解決できます。
PHP コード

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


ob_start(); // phpinfo 関数を使用します。 >$info=ob_get_contents( ); //バッファの内容を取得して $info に代入します
$file=fopen('info.txt','w'); //ファイル info.txt を開きます
fwrite($file,$info ); //info.txt に情報を書き込みます
fclose($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 というクラスを通じて実装されます。 . ob シリーズ関数を使用して実装します。
最初の方法については、この記事で検討する問題ではないため、詳細は説明しません。
2 番目のメソッドの具体的な実装を見てみましょう。
例 4.
PHP コード



コードをコピー

コードは次のとおりです: ob_start();//バッファを開きます

?>



php ページのすべての出力
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.
PHP コード

コードをコピー

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

Function run_code($code) { If($code) { ob_start(); eval($code);

$contents = ob_end_clean();

}else {
echo "エラー! 出力がありません" ;
exit();
return $contents;


上記の例はあまり役に立ちませんが、$code 自体が変数を含む出力ページであることが一般的です。この例では、eval を使用して $code 内の変数を置換し、出力結果をキャプチャします。一度に処理します...
例 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) <[email ]catoc@163.net [/email]>
** 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);
関数 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 "gzip";
return 0;
}
/* $level = 圧縮レベル 0-9、0=なし、 9=max */
function GzDocOut($level=1,$debug=0){
$ENCODING = CheckCanGzip();
if ($ENCODING){
print "nn";
$Contents = ob_get_contents();
ob_end_clean();
if ($debug){
$s = "

Not圧縮長: ".strlen($Contents);
$s .= "
圧縮長: ".strlen(gzcompress($Contents,$level));
$Contents .= $s;
}
header("Content-Encoding: $ENCODING");
print "x1fx8bx00x00x00x00x00";
$Crc = crc32($Contents);
$Contents = gzcompress($Contents,$level);
$Contents = substr($Contents, 0, strlen($Contents) - 4);
print $Contents; 'V' ,$Crc);
print Pack('V',$Size);
}else{
ob_end_flush();
🎜>}
?>


これは、送信されたコンテンツを圧縮するために zlib 関数を使用した、かなり前のコードです。この効果は 10,000 ページを超えるページで発生し、ページが大きくなればなるほど、その効果はより明らかになります...

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

一致式(PHP 8)とそれがスイッチとどのように異なるかを説明します。 一致式(PHP 8)とそれがスイッチとどのように異なるかを説明します。 Apr 06, 2025 am 12:03 AM

PHP8では、一致式は、式の値に基づいて異なる結果を返す新しい制御構造です。 1)Switchステートメントに似ていますが、実行ステートメントブロックの代わりに値を返します。 2)一致式の式は厳密に比較され、セキュリティが向上します。 3)スイッチステートメントの脱落の可能性を回避し、コードのシンプルさと読みやすさを向上させます。

HTML、CSS、およびJavaScriptの役割:コアの責任 HTML、CSS、およびJavaScriptの役割:コアの責任 Apr 08, 2025 pm 07:05 PM

HTMLはWeb構造を定義し、CSSはスタイルとレイアウトを担当し、JavaScriptは動的な相互作用を提供します。 3人はWeb開発で職務を遂行し、共同でカラフルなWebサイトを構築します。

クロスサイトリクエストフォーファリー(CSRF)とは何ですか?また、PHPにCSRF保護をどのように実装しますか? クロスサイトリクエストフォーファリー(CSRF)とは何ですか?また、PHPにCSRF保護をどのように実装しますか? Apr 07, 2025 am 12:02 AM

PHPでは、予測不可能なトークンを使用して、CSRF攻撃を効果的に防ぐことができます。特定の方法には次のものが含まれます。1。フォームのCSRFトークンを生成および埋め込みます。 2.リクエストを処理するときにトークンの有効性を確認します。

PHPで厳密なタイプ(declare(strict_types = 1);)を説明します。 PHPで厳密なタイプ(declare(strict_types = 1);)を説明します。 Apr 07, 2025 am 12:05 AM

PHPの厳格なタイプは、declare(strict_types = 1)を追加することで有効になります。ファイルの上部に。 1)関数パラメーターのタイプチェックと戻り値を強制して、暗黙の型変換を防ぎます。 2)厳格なタイプを使用すると、コードの信頼性と予測可能性を改善し、バグを減らし、保守性と読みやすさを向上させることができます。

HTML、CSS、およびJavaScriptの理解:初心者向けガイド HTML、CSS、およびJavaScriptの理解:初心者向けガイド Apr 12, 2025 am 12:02 AM

webdevelopmentReliesOnhtml、css、andjavascript:1)htmlStructuresContent、2)cssStylesit、および3)Javascriptaddsinteractivity、形成、

どのようにしてクラスが拡張されたり、PHPでメソッドがオーバーライドされたりするのを防ぐことができますか? (最終キーワード) どのようにしてクラスが拡張されたり、PHPでメソッドがオーバーライドされたりするのを防ぐことができますか? (最終キーワード) Apr 08, 2025 am 12:03 AM

PHPでは、最終的なキーワードを使用して、クラスが継承されないようにし、メソッドが上書きされます。 1)クラスを決勝としてマークする場合、クラスを継承することはできません。 2)メソッドを最終的にマークする場合、メソッドはサブクラスによって書き換えられません。最終的なキーワードを使用すると、コードの安定性とセキュリティが保証されます。

HTMLにおけるReactの役割:ユーザーエクスペリエンスの向上 HTMLにおけるReactの役割:ユーザーエクスペリエンスの向上 Apr 09, 2025 am 12:11 AM

ReactはJSXとHTMLを組み合わせてユーザーエクスペリエンスを向上させます。 1)JSXはHTMLを埋め込み、開発をより直感的にします。 2)仮想DOMメカニズムは、パフォーマンスを最適化し、DOM操作を削減します。 3)保守性を向上させるコンポーネントベースの管理UI。 4)国家管理とイベント処理は、インタラクティブ性を高めます。

JavaScriptまたはCSSを介してブラウザ印刷設定でページの上部と終了を制御する方法は? JavaScriptまたはCSSを介してブラウザ印刷設定でページの上部と終了を制御する方法は? Apr 05, 2025 pm 10:39 PM

JavaScriptまたはCSSを使用して、ブラウザの印刷設定のページの上部と端を制御する方法。ブラウザの印刷設定には、ディスプレイが...

See all articles