出力制御関数は、header() または setcookie() を使用して送信されるファイル ヘッダー情報には影響せず、echo() および PHP コードと同様のデータ ブロックにのみ影響します。
出力制御の一般的な印象を与える簡単な例を示します。
例 1.
PHP コード
コードをコピー コードは次のとおりです。
ob_start(); // バッファを開きます
echo "Hellon" //Output
header(" location:index.php”); //ブラウザをindex.phpにリダイレクトします
ob_end_flush(); //すべてのコンテンツをブラウザに出力します
コードをコピーします。 コードは次のとおりです:
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() を呼び出す前 (またはプログラムが実行される前) にキャッシュの内容が出力されなくなります。
コードは次のとおりです: 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 構文の強調表示など、いくつかのキーワードをキャプチャして再処理してみることができます。個人的には、この関数がさまざまな問題を解決できる最も優れた部分だと思いますが、十分な想像力が必要です...
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 ページを超えるページで発生し、ページが大きくなればなるほど、その効果はより明らかになります...