ホームページ  >  記事  >  バックエンド開発  >  PHP の基本チュートリアル PHP ページのバッファリングのメカニズム

PHP の基本チュートリアル PHP ページのバッファリングのメカニズム

巴扎黑
巴扎黑オリジナル
2016-11-07 11:51:18917ブラウズ

PHPは実はたくさんの仕組みや機能があり、繰り返し使うと簡単な応用でも魔法のような効果が現れます。 Band of Brothers PHP トレーニング

ここでは ob_start() 関数について説明します。

ob_start() 関数はバッファを開くために使用されます。たとえば、header() 関数の前にキャリッジリターン、スペース、改行を含む出力がある場合、「ヘッダーはすべて送信の準備ができていました」というエラーが発生します。この場合、最初に ob_start() を使用して開くことができます。バッファ PHP コードのデータ ブロックと echo() 出力はバッファに入りますが、すぐには出力されません。もちろん、バッファを開くと、多くの処理が行われます。関数については、想像力を働かせてください。要約すると次の 4 つです:

1. header( before ();//すべてのコンテンツをブラウザに出力します

?>

2. phpinfo() 関数は次のことができます。クライアント側とサーバー側の情報を取得しますが、クライアント側の情報を保存するには、バッファーメソッドが最適です。

phpinfo(); // phpinfo 関数を使用します

; info=ob_get_contents(); //バッファの内容を取得して$infoに代入する

$file=fopen(' info.txt','w');// ファイルinfo.txtを開く

fwrite( $file,$info); //info.txtに情報を書き込む

fclose($file); //ファイルinfo.txtを閉じる

?>

3. 静的ページ技術

ob_start();//バッファを開く

?>

phpページの全出力

$content =ob_get_contents();//phpページの出力を取得

の全内容 $fp =fopen("output00001.html", "w "); //ファイルを作成して開き、書き込みの準備をします

fwrite($fp, $content); //phpページを配置します 内容をすべてoutput00001.htmlに書き込みます、そして...

fclose( $fp);

?>

4. 出力コード

Function run_code($code) {

If($code) {

ob_start(

}

Return $contents;

}

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

OutputControl の一般的な印象を与えるために簡単な例を見てみましょう:

例 1.

CODE
ob_start() //バッファをオープンします

echo ”Hellon”; / /Output

; header(”location:index.php”);//ブラウザをindex.phpにリダイレクト

ob_end_flush();//全ての内容をブラウザに出力

?>

ヘッダーの全ペア( を知っている人)関数は、この関数がファイル ヘッダーをブラウザに送信することを認識していますが、この関数を使用する前に出力 (スペース、キャリッジ リターン、ライン フィードなどの空の出力を含む) がある場合は、エラーが表示されます。最初の行の 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: 内部バッファの内容を返します。

使用法: stringob_get_contents(void)

説明: この関数は、出力バッファがアクティブ化されていない場合、現在のバッファの内容を返します。

4. ob_get_length: 内部バッファの長さを返します。

使用法: intob_get_length(void)

説明: この関数は、出力バッファーがアクティブ化されていない場合、ob_get_contents と同じように現在のバッファーの長さを返します。その後、FALSE を返します。

5. ob_end_flush: 内部バッファの内容をブラウザに送信し、出力バッファを閉じます。

使用法: voidob_end_flush(void)

説明: この関数は、出力バッファーの内容 (存在する場合) を送信します。

6. ob_end_clean: 内部バッファの内容を削除し、内部バッファをクローズします

使用方法: voidob_end_clean(void)

説明: この関数は内部バッファの内容を出力するのではなく、内部バッファを削除します

7 , ob_implicit_flush: 絶対リフレッシュをオンまたはオフにします

使用方法: void ob_implicit_flush([int flag])

説明: Perl を使用したことがある人なら誰でも、この文字列は $|=x の意味を知っています。 ob_implicit_flush 関数は、その関数と同じです。デフォルトでは、絶対出力をオンにした後、各スクリプト出力がブラウザーに直接送信され、flush() を呼び出す必要はありません

2.深さの理解:

1. Flush 関数について:

この関数は PHP3 で登場しました。これは、ブラウザのキャッシュをリフレッシュする非常に便利な関数です。

例 2 .

CODE
for($i = 1; $i
// つまり、キャッシュの内容が一定のサイズに達しないと、プログラムの実行が完了するまで出力されません。

// テストの結果、このサイズの下限は 256 文字であることがわかりました。これは、今後キャッシュによって受信されるコンテンツが継続的に送信されることを意味します。

For($j = 1; $j
echo $j.”

flush(); out ブラウザに表示してみます
sleep(1); // プログラムを 1 秒間「スリープ」させて、効果をより明確に確認できるようにします

?>

具体的な効果はこちら http://www.php2000.com/~uchinaboy/out.php を参照してください

PHP2000 の最新の PHP チャット ルームでは、残念ながら、ソース コードは公開されていません

注: に追加された場合。プログラムの最初の ob_implicit_flush() は絶対リフレッシュをオンにし、プログラム内でフラッシュ() を使用できなくなります。これによる利点は次のとおりです。

2. ob シリーズの関数について:

例:

例 3.

例えば、サーバーとクライアントの設定情報を使用できますが、この情報はクライアントによって異なります。 phpinfo() 関数の出力? 以前は、方法がなかったと言えますが、バッファ制御を使用すると、次のように簡単に解決できます。バッファ

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() の使い方の重要なポイントをマスターしました。


. ob_start を使用してブラウザのキャッシュを開くと、flush()、ob_end_flush() を呼び出す前 (またはプログラムが実行される前) にキャッシュの内容が出力されなくなります。

これで、出力コンテンツの後にヘッダー、setcookie、セッションを使用できることがわかりました。これは、ob_start のパラメーターをキャッシュの書き込み後に使用することもできます。 ob_start("ob_gzhandler "); などのコマンドを実行し、最も一般的な方法は、ob_get_contents() を使用してキャッシュの内容を取得し、それを処理することです...

処理が完了したら、次のことができます。 Output、flush()、ob_end_flush()、およびプログラム実行後の自動出力などのさまざまなメソッドを使用します。もちろん、ob_get_contents() を使用している場合は、出力メソッドを自分で制御する必要があります。

さあ、ob シリーズの関数で何ができるか見てみましょう...

1. 静的テンプレート技術

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

私が知っている静的出力を実現するには 2 つの方法があります:

y10k によって修正された phplib の template.inc.php というクラスを通じて実装されます。

obシリーズの関数を使用して実装されています。

最初の方法については、この記事で検討する問題ではないので、詳細は説明しません。

2番目のメソッドの具体的な実装を見てみましょう:

例4.

CODE
ob_start();//バッファを開きます

?>

phpページのすべての出力

 

$content =ob_get_contents();// php ページで出力されたすべてのコンテンツを取得します

$fp =fopen("output00001.html", "w"); // ファイルを作成して開きます, 書き込む準備ができました Enter

fwrite($fp, $content); //php ページの内容をすべて Output00001.html に書き込みます、そして...

fclose($fp)?>

;このように、いわゆる静的テンプレートは簡単に実装できます…

2. 出力をキャプチャします

上記の例 4 は、最も単純なケースです。書き込む前に $content を操作することもできます…

あなたは。例 3 で説明した PHP 構文の強調表示など、いくつかのキーワードをキャプチャして再処理することを試みることができます。個人的には、この関数が一番良いところだと思っています。様々な問題を解決できますが、十分な想像力が必要です...

例 5.

CODE

Function run_code($code) ) {  

If($code) {

ob_start();

$contents =ob_get_contents(); } else {

echo "エラーです!出力なし";

exit();

}

return $contents;

}

上記の例はあまり役に立ちませんが、典型的には $code 自体が変数を含む出力ページであり、この例では、eval を使用して $code 内の変数を置き換え、出力をキャプチャして再度処理します...

例 6. 送信を高速化します

ob_start();

ob_implicit_flush(0) ;
if(strpos($HTTP_ACCEPT_ENCODING , 'x-gzip') !== false) return ”x-gzip”;

if(strpos($HTTP_ACCEPT_ENCODING, 'gzip') !== false) return ”gzip”;

return 0;
 
}

functionGzDocOut($level=1,$debug=0){

$ENCODING = CheckCanGzip();

print “n
n”;

$Contents =ob_get_contents();

ob_end_clean();

if ($debug){

$s = ”
Notcompress length: ”.strlen($Contents);

$s .= ”

圧縮編length: ”.strlen(gzcompress( $Contents, $Level));

$Contents. = $S;

ヘッダー ("Content-Encoding: $Encoding");

$Crc = crc32($Contents);

$Contents =gzcompress($Contents,$level);
$Contents = substr($Contents,0, strlen($Contents) – 4);

print $Contents;

print Pack('V',$Size); );

exit;

} else{

ob_end_flush();

exit コードは weblogs.com にあります 彼が到着したとき、彼は送信されたコンテンツを圧縮するために zlib の関数を使用しました。効果は 10,000 ページを超えるページで生成され、ページが大きくなるほど効果はより明白になります...

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