ホームページ  >  記事  >  バックエンド開発  >  PHP_PHP チュートリアルの ob_start 関数の使用手順

PHP_PHP チュートリアルの ob_start 関数の使用手順

WBOY
WBOYオリジナル
2016-07-13 10:25:28918ブラウズ

PHP の ob_start(); を使用します

ブラウザのキャッシュを制御する

出力制御機能を使用すると、スクリプト内のデータの出力を自由に制御できます。特にデータ出力後にファイルヘッダーを出力したい場合に非常に便利です。出力制御関数は、header() または setcookie() を使用して送信されるファイル ヘッダー情報には影響せず、echo() および PHP コードと同様のデータ ブロックにのみ影響します。

出力制御の一般的な印象を皆さんに伝えるために、まず簡単な例を示しましょう:

例1.

プログラムコード

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

ob_start(); //バッファを開きます
echo "Hellon" //Output
header("location:index; .php" ); //ブラウザをindex.php
ob_end_flush()にリダイレクトします;//すべてのコンテンツをブラウザに出力します
?>

header()関数を知っている人なら誰でも、この関数がAを送信することを知っています。ファイルヘッダーはブラウザに与えられますが、この関数を使用する前に出力 (スペース、復帰、改行などの空の出力を含む) がある場合、エラーが表示されます。最初の行の ob_start() を削除してこのプログラムを実行すると、次のエラー メッセージが表示されることがわかります。「ヘッダーはすべて送信準備ができました。」ただし、ob_start を使用すると、エラー メッセージは表示されません。その理由は、バッファーが開かれたときに、echo 以降の文字がブラウザーに出力されず、flush を使用するまでサーバー上に出力されないためです。または ob_end_flush なので、ファイル ヘッダー出力エラーは発生しません。

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.

プログラムコード


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


注: ob_implicit_flush() をプログラムの先頭に追加して絶対リフレッシュを有効にすると、プログラム内で flash() を使用できなくなります。これによる利点は次のとおりです。効率が向上します。

2. obシリーズの機能について:

まず、私の良き友人 y10k の例を引用したいと思います。

例 3.

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

プログラムコード

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

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の無駄になりますので、興味のある方は構文強調表示機能で表示された結果を保存しておいてください。見てください

これで、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.

プログラムコード


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

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.

プログラムコード

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

Function run_code($code) {
If($code) {
ob_start();
eval($code) ;
$ content = ob_get_contents();
ob_end_clean();
}else {
echo "エラー! 出力なし";
exit();
}
return $contents;
?>
}

目的上記の例 それほど大きくはありませんが、$code 自体が変数を含む出力ページであることが非常に一般的です。この例では、eval を使用して $code 内の変数を置き換え、出力結果が出力キャプチャされて再度処理されます。 ...

例6. 送信速度を上げる

プログラムコード

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

/*
** タイトル....: PHP4 HTTP Compression Speeds up the Web
**バージョン....: 1.20
** 作成者....: catoc
** ファイル名....: gzdoc.php
** 最終変更日.. : 18/10/2000
** 要件...: PHP4 >= 4.0.1
** PHP は --with-zlib[=DIR] で構成されました
** 注意事項.... : ダイナミック コンテンツ アクセラレーションは、データ送信データをオンザフライで圧縮します
**、Sun jin hu (catoc) によるコード
** 1998/1999 年以降のほとんどの新しいブラウザには
** が搭載されています「コンテンツ エンコーディング」として知られる HTTP 1.1
** 標準をサポートするためです。
** 基本的に、ブラウザは
** サーバーに「コンテンツ エンコーディング」
** を受け入れられることを示し、サーバーが対応できる場合は受け入れます。
** データを圧縮して送信します。
** ブラウザはそれを解凍し、
** ページをレンダリングします。
**
** John Lim (jlim@natsoft.com.my) によって変更されました
** Sandy McArthur, Jr によるアイデア
** 使用法....:
** 最初の '** ---------- --Startファイル----------
** |** | include('gzdoc.php');
** |? >
** | |... ページ ...
** |
** |** |? >
** ---- --- ------ファイルの終わり----------
*/
ob_start();
ob_implicit_flush(0);
function CheckCanGzip(){
global $HTTP_ACCEPT_ENCODING;
if (headers_sent( ) || connection_aborted()){
return 0;
}
if (strpos($HTTP_ACCEPT_ENCODING, 'x-gzip') !== false) return "x-gzip";
if ( $HTTP_ACCEPT_ENCODING,'gzip') !== false) return "gzip";
return 0;
}
/* $level = 圧縮レベル 0-9、0=なし、9=最大 */
function GzDocOut ($level =1,$debug=0){
$ENCODING = CheckCanGzip();
if ($ENCODING){
print "nn";
$Contents = ob_get_contents() ;
ob_end_clean();
if ($debug){
$s = "

長さは圧縮されていません: ".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;
}
}
?>




http://www.bkjia.com/PHPjc/825058.html

www.bkjia.com

http://www.bkjia.com/PHPjc/825058.html技術記事 PHP の ob_start(); を使用してブラウザのキャッシュを制御すると、スクリプト内のデータの出力を自由に制御できます。特に、既に存在するデータを使用したい場合に非常に便利です。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。