PHP の ob_start(); を使用します
ブラウザのキャッシュを制御する
出力制御機能を使用すると、スクリプト内のデータの出力を自由に制御できます。特にデータ出力後にファイルヘッダーを出力したい場合に非常に便利です。出力制御関数は、header() または setcookie() を使用して送信されるファイル ヘッダー情報には影響せず、echo() および PHP コードと同様のデータ ブロックにのみ影響します。
出力制御の一般的な印象を皆さんに伝えるために、まず簡単な例を示しましょう:
例1.
プログラムコード
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 flag])
注: Perl を使用したことがある人なら誰でも $|=x の意味を知っています。この文字列はバッファをオープン/クローズすることができ、デフォルトでは絶対出力をオンにした後にバッファをクローズします。各スクリプト出力はブラウザに直接送信されるため、flush() を呼び出す必要はありません
2. 深い理解:
1. フラッシュ機能について:
この関数は PHP3 で登場した、非常に効率的な関数です。フラッシュを説明するために、非常にわかりやすい操作効果を示す例を示します。
例2.
プログラムコード2. obシリーズの機能について:
まず、私の良き友人 y10k の例を引用したいと思います。
例 3.
たとえば、サーバーとクライアントの設定情報を使用できますが、この情報はクライアントによって異なります。phpinfo()関数の出力を保存したい場合はどうすればよいでしょうか。バッファ制御が存在しない前は、まったく方法がなかったと言えますが、バッファ制御を使用すると、それを簡単に解決できます。
プログラムコード
「これはただのことですか? 他に用途はあるのですか?」と疑問に思う人もいるかもしれません。もちろん、たとえば、作者のフォーラムの PHP 構文ハイライトはこれに関連しています (PHP のデフォルトの構文ハイライト機能は直接出力します)。呼び出すたびに結果が表示されるとCPUの無駄になりますので、興味のある方は構文強調表示機能で表示された結果を保存しておいてください。見てください
これで、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.
プログラムコード2. 出力をキャプチャ
上記の例 4. は最も単純なケースです...
を書き込む前に $content を操作することもできます。例 3 で説明した PHP 構文の強調表示など、いくつかのキーワードをキャプチャして再処理してみることができます。個人的にはこの機能がこの機能の最大のエッセンスだと思っていますが、様々な問題を解決できるのですが、十分な想像力が必要です...
例 5.
プログラムコード
例6. 送信速度を上げる
プログラムコード
長さは圧縮されていません: ".strlen($Contents);
$s .= "
圧縮された長さ: ".strlen (gzcompress( $Contents,$level));
$Contents .= $s;
}
header("Content-Encoding: $ENCODING");
print "x1fx8bx08x00x00x00x00x00";
$Size = strlen($Contents); = crc32($Contents);
$Contents = gzcompress($Contents,$level);
$Contents = substr($Contents, 0, strlen($Contents) - 4);
print $Contents;
print Pack(' V',$Crc);
print Pack('V',$Size);
exit;
}else{
ob_end_flush();
exit;
}
}
?>
www.bkjia.com