ホームページ >バックエンド開発 >PHPチュートリアル >PHP関数ob_start()がブラウザキャッシュを制御する方法の詳細な説明

PHP関数ob_start()がブラウザキャッシュを制御する方法の詳細な説明

WBOY
WBOYオリジナル
2016-07-25 08:57:301139ブラウズ
  1. ob_start(); //バッファ
  2. echoを開く "Hellon"; //Output
  3. header("location:index.php"); //ブラウザをインデックスにリダイレクトします。 ob_end_flush();//全コンテンツをブラウザに出力
  4. //by bbs.it-home.org
  5. ?>
コードをコピー
ここではphpのheader関数を使用しています。ファイル ヘッダーをブラウザに送信しますが、この関数を使用する前に出力 (スペース、復帰、改行などの空の出力を含む) がある場合は、エラーが表示されます。 最初の行の ob_start() を削除してからこのプログラムを実行すると、「ヘッダーはすべて送信準備ができました」というエラー メッセージが表示されます。 ob_start を追加してもエラーは表示されません。その理由は、バッファーが開かれたときに、echo 以降の文字がブラウザーに出力されず、flush または ob_end_flush を使用するまでサーバー上に保持されるからです。そのため、ファイル ヘッダーの出力エラーは発生しません。

今日のトピックを始めましょう: ob_start() を使用してブラウザのキャッシュを制御します。

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

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

3、ob_get_contents: 内部バッファの内容を返します。 使用法: 文字列 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 フラグ]) 注: Perl を使用したことがある人なら誰でも $|=x の意味を知っています。この文字列はバッファをオープン/クローズできます。デフォルトでは、絶対出力をオンにした後にバッファをクローズします。スクリプト出力 ブラウザに直接送信します。flush() を呼び出す必要はありません

2. 深い理解: 1.フラッシュ機能について: ブラウザのキャッシュを更新するために使用されます。

例:

    for($i = 1; $i <= 300; $i++ ) print(" ");
  1. // 重要なステートメント、キャッシュの構造は次の場合にのみコンテンツを作成します。一定のサイズに達するとブラウザから出力できるようになります
  2. // つまり、キャッシュ内容が一定のサイズに達しないとプログラムの実行が完了するまで出力されません。
  3. // テストの結果、このサイズの下限は 256 文字であることがわかりました。これは、今後キャッシュによって受信されるコンテンツが
  4. // 継続的に送信されることを意味します。
  5. For($j = 1; $j <= 20; $j++) {
  6. echo $j."
  7. ";
  8. flush(); //これにより、キャッシュ内の新しいコンテンツが絞り出されて表示されますブラウザに移動します
  9. sleep(1); // プログラムを 1 秒間「スリープ」させて、効果をより明確に確認できるようにします
  10. }
  11. ?>
コードをコピーします
注:プログラム内で ob_implicit_flush() をヘッダーに追加して絶対フラッシュをオンにすると、プログラム内でフラッシュ() を使用できなくなります。

2. obシリーズの機能について: たとえば、サーバーとクライアントの設定情報を使用できますが、この情報はクライアントによって異なります。phpinfo() 関数の出力を保存したい場合はどうすればよいでしょうか。 バッファ制御がない前は、まったく解決策がなかったと言えますが、バッファ制御を使用すると、簡単に解決できます。 例:

ob_start(); //バッファを開きます
  • phpinfo(); //phpinfo関数を使用します
  • $info=ob_get_contents(); //バッファの内容を取得して割り当てます。 to $info
  • $file=fopen('info.txt','w'); // ファイルを開きます info.txt
  • fwrite($file,$info); // info.txt
  • fclose($) file); //ファイル info.txt を閉じます
  • //by bbs.it-home.org
  • ?>
  • コードをコピーします
  • 上記の方法を使用すると、以前は不可能だったかもしれないさまざまなユーザーの phpinfo 情報を保存できます。実は上記は一部の「処理」を「関数」に変換する方法なのです! PHP のデフォルトの構文強調表示機能は直接出力するため、呼び出すたびに結果が表示されると CPU の無駄になります。

    ob_start() の要点。 . ob_start を使用してブラウザのキャッシュを開くと、flush()、ob_end_flush() を呼び出す前 (またはプログラムが実行される前) にキャッシュの内容が出力されなくなります。 これで、出力コンテンツの後にヘッダー、setcookie、セッションを使用できることがわかりました。これは、ob_start のパラメーターをキャッシュの書き込み後に使用することもできます。 ob_start("ob_gzhandler") などのコマンドを実行します。最も一般的な方法は、ob_get_contents() を使用してキャッシュの内容を取得し、それを処理することです。 . 処理が完了したら、flush()、ob_end_flush()、プログラム実行完了後の自動出力など、さまざまなメソッドを使用して出力できます。もちろん、ob_get_contents() を使用している場合は、出力メソッドを自分で制御する必要があります。

    obシリーズの機能の使い方を学びましょう。

    1. 静的テンプレート技術 はじめに: いわゆる静的テンプレート技術は、特定の方法を使用して、ユーザーがクライアント側で PHP によって生成された HTML ページを取得できるようにします。この HTML ページが更新されなくなると、別のユーザーがこのページを再度参照したときに、プログラムは、sina、163、sohu などの大量の情報を含む一部の Web サイトの PHP および関連データベースを呼び出すことはなくなります。このようなテクノロジーの恩恵は非常に大きいです。

    静的な出力を実現するには 2 つの方法があります。 . y10k によって修正された phplib の template.inc.php というクラスを通じて実装されます。 . ob シリーズの関数を使用して実装されます。 1 つ目の方法については、この記事で検討する問題ではないため、詳細については説明しません。 次に、2 番目のメソッドの具体的な実装を見てみましょう。 例:

    1. ob_start();//バッファを開きます
    2. ?>
    コード

    phpページの出力全体をコピーします。

    1. $content = ob_get_contents();//PHPページによって出力されたすべてのコンテンツを取得します
    2. $fp = fopen("output00001.html", "w"); //ファイルを作成しますそして、開いて書き込みの準備をします
    3. fwrite($fp, $content); //php ページのすべてのコンテンツを Output00001.html に書き込み、その後...
    4. fclose($fp);
    5. //bbs.it により-home.org
    6. ?>
    コードをコピー

    2. 出力をキャプチャします 上記の例は最も単純なケースです。書き込む前に $content を操作することもできます。 いくつかのキーワードをキャプチャしてから、PHP 構文の強調表示などの再処理を試みることができます。 例 5:

    1. Function run_code($code) {
    2. If($code) {
    3. ob_start();
    4. eval($code);
    5. $contents = ob_get_contents();
    6. ob_end_clean();
    7. }else {
    8. echo "エラー! 出力なし";
    9. exit();
    10. }
    11. return $contents;
    12. }
    コードをコピー

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

    例 6、送信を高速化する

    1. ** ------------ファイルの開始----------

    2. ** | ** | include('gzdoc.php');
    3. ** |? >
    4. ** |
    5. ** |... ページ ...
    6. ** |
    7. * * |** | gzdocout();
    8. ** |? >
    9. ** -------------ファイルの終わり----------
    10. */

    11. ob_start();

    12. ob_implicit_flush(0);
    13. function CheckCanGzip(){
    14. global $HTTP_ACCEPT_ENCODING;
    15. if (headers_sent() || connection_timeout() || connection_aborted() ) {
    16. return 0;
    17. }

    18. if (strpos($HTTP_ACCEPT_ENCODING, 'x-gzip') !== false) return "x-gzip";

    19. if (strpos($HTTP_ACCEPT_ENCODING , 'gzip') !== false) return "gzip";
    20. return 0;
    21. }

    22. /* $level = 圧縮レベル 0 ~ 9、0=なし、9=最大 * /

    23. function GzDocOut($level=1,$debug=0){
    24. $ENCODING = CheckCanGzip();
    25. if ($ENCODING){
    26. print "nn"; $Contents = ob_get_contents();
    27. ob_end_clean();
    28. if ($debug){
    29. $s = "

      長さを圧縮していません: ".strlen($Contents);

    30. $s .= "
    31. 圧縮された長さ: ".strlen(gzcompress($Contents,$level));
    32. $Contents .= $s;
    33. }

    34. header("Content-Encoding: $ENCODING");

    35. print " x1fx8bx08x00x00x00x00x00 ";
    36. $Size = strlen($Contents);
    37. $Crc = crc32($Contents);
    38. $Contents = gzcompress($Contents,$level);
    39. $Contents = substr($Contents, 0, strlen($ コンテンツ) - 4);
    40. print $Contents;
    41. print Pack('V',$Crc);
    42. print Pack('V',$Size);
    43. exit;
    44. }else{
    45. ob_end_flush();
    46. exit; }
    47. }
    48. ?> ページが大きくなるほど、その効果はより明らかになります。
    49. これは、PHP での ob_start とその他の関連キャッシュ関数の使用方法の紹介です。これが皆さんのお役に立てれば幸いです。

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