出力制御関数は、header() または setcookie() を使用して送信されるファイル ヘッダー情報には影響せず、echo() および PHP コードと同様のデータ ブロックにのみ影響します。
出力制御の一般的な印象を与えるために、まず簡単な例を見てみましょう:
例 1.
コードをコピーします コードは次のとおりです:
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() または 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 関数はそれと同じです。デフォルトでは、絶対出力をオンにした後、各スクリプト出力がブラウザーに直接送信され、flush() を呼び出す必要はありません。 -深さの理解:
1. フラッシュ関数について: この関数は、ブラウザのキャッシュを更新する非常に便利な関数です。
例 2 .
コードをコピーします コードは次のとおりです:
for($i = 1; $i <= 300; $i++ ) print(" ") ;
// この文は非常に重要です。重要なのは、キャッシュの構造が、そのコンテンツが特定のサイズに達した場合にのみブラウザーから出力できるということです
// つまり、キャッシュのコンテンツが一定のサイズに達すると、プログラムの実行が完了するまで出力されません。
// テストの結果、このサイズの下限は 256 文字であることがわかりました。これは、今後キャッシュによって受信されるコンテンツが
// 継続的に送信されることを意味します。
For($j = 1; $j <= 20; $j++) {
echo $j.”
flush(); // これにより、キャッシュ内の新しいコンテンツが絞り出されて表示されます。ブラウザに移動します
sleep(1); //プログラムを少しの間「スリープ」させます。これにより、効果をより明確に確認できるようになります
}
?>
具体的な効果を見るにはここにアクセスしてください http://www.php2000.com/~uchinaboy/out.php
PHP2000 の最新の PHP チャット ルームではこのテクノロジーが使用されていますが、残念ながらソース コードは公開されていません
注: ob_implicit_flush() をプログラムの先頭に追加して絶対リフレッシュを有効にすると、プログラム内でフラッシュ() を使用できなくなります。これによる利点は次のとおりです。効率が向上します。
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); info.txt
?>
上記の方法を使用すると、以前は不可能だったかもしれないさまざまなユーザーの phpinfo 情報を保存できます。実は上記は一部の「処理」を「関数」に変換する方法なのです!
「これはただのことですか? 他に用途はあるのですか?」と疑問に思う人もいるかもしれません。もちろん、たとえば、作者のフォーラムの PHP 構文ハイライトはこれに関連しています (PHP のデフォルトの構文ハイライト機能は直接出力します)。呼び出すたびに結果が表示されるとCPUの無駄になりますので、興味のある方は構文強調表示機能で表示された結果を保存しておいてください。 http://www.zphp.com/bbs/ をご覧ください。
これで、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 つの方法があります:
. y10k によって変更された phplib の template.inc.php というクラスを通じて実装されます。
<2>. ob シリーズの関数を使用して実装されます。
最初の方法については、この記事で検討する問題ではないため、詳細は説明しません。
2 番目のメソッドの具体的な実装を見てみましょう:
例 4.
ob_start();//バッファを開きます
?>
PHP ページのすべての出力
$ content = ob_get_contents(); //php ページによって出力されたすべてのコンテンツを取得します
$fp = fopen("output00001.html", "w") //ファイルを作成して書き込み用に開きます
fwrite($fp) , $content); //php ページのすべてのコンテンツを output00001.html に書き込みます。
fclose($fp)
?> このようにして、いわゆる静的テンプレートを簡単に作成できます。実装...
II 、出力のキャプチャ
上記の例 4. は最も単純なケースです。書き込む前に $content を操作することもできます...
例 3 のように、いくつかのキーワードをキャプチャしてから再処理することもできます。 PHP 構文の強調表示。個人的には、この関数がこの関数の最も優れた部分だと思います。これにより、さまざまな問題を解決できますが、十分な想像力が必要です...
例 5.
Function run_code($code) {
If($code) {
eval($code);
$contents = ob_end_clean();
echo "エラー!
exit();上の例はあまり役に立ちませんが、一般的に $code 自体は変数を含む出力ページであり、この例では eval を使用して $code 内の変数を置き換え、結果を出力します。出力を再度キャプチャし、再度処理します...
例 6. 送信を高速化します
/*
** タイトル....: PHP4 HTTP 圧縮により Web が高速化されます
** バージョン ......: 1.20
** 作成者....: catoc
** ファイル名....: 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 (jlim@natsoft.com.my) によって変更されました。 ** Sandy McArthur, Jr のアイデアに基づく
** 使用法....:
** 最初の '' タグの先頭にはスペースはありません
** -------- - ---ファイルの先頭----------
** |
** |> HTML> ;
** |... ページ ...
** |*/
ob_start();
function CheckCanGzip(){
global $HTTP_ACCEPT_ENCODING; (headers_sent() || connection_timeout() || connection_aborted()){
return 0;
}
if (strpos($HTTP_ACCEPT_ENCODING, 'x-gzip') !== false) return "x-gzip"; (strpos($HTTP_ACCEPT_ENCODING,'gzip') !== false) return "gzip";
return 0;
}
/* $level = 圧縮レベル 0-9、0=なし、9=最大 */
関数 GzDocOut ($level=1,$debug=0){
$ENCODING = CheckCanGzip();
if ($ENCODING){
print "nn"; ob_get_contents();
ob_end_clean();
if ($debug){
$s = "長さ: ".strlen($Contents) .= "
圧縮された長さ: " .strlen (gzcompress($Contents,$level));
$Contents .= $s;
header("Content-Encoding: $ENCODING");
$Size = strlen($Contents );
$Crc = crc32($Contents);
$Contents = gzcompress($Contents,$level);
$Contents, 0, strlen($Contents) - 4); Pack('V',$Crc);
exit;
ob_end_flush();
これは非常にcatoc の初期のコードは、送信されたコンテンツを圧縮するために zlib 関数を使用しており、ページが大きいほど効果が高いことがテストで示されました。明らかな効果…
http://www.bkjia.com/PHPjc/320182.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/320182.html
技術記事
出力制御関数は、header() または setcookie() を使用して送信されるファイル ヘッダー情報には影響しませんが、echo() や PHP コードと同様のデータ ブロックにのみ影響します。 まずは簡単なものからあげましょう...