ホームページ > バックエンド開発 > PHPチュートリアル > PHP ob_start() および ob_gzhandler()

PHP ob_start() および ob_gzhandler()

WBOY
リリース: 2016-06-23 14:36:22
オリジナル
761 人が閲覧しました

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

出力制御の一般的な印象を与えるために簡単な例を示しましょう:

例 1.
--------------------- --- ---------------------------------------------- --- ------------
---------------------------------

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

echo "Hellon"; //出力

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

ob_end_flush();すべてのコンテンツをブラウザに送信します
?> -------- -------------------------------------- --------
----------------------------------
ヘッダーをご存知の皆様( ) 関数は、この関数がファイル ヘッダーをブラウザに送信することを認識していますが、この関数を使用する前に出力 (スペース、キャリッジ リターン、ライン フィードなどの空の出力を含む) がある場合は、エラーが表示されます。最初の行の ob_start() を削除してこのプログラムを実行すると、次のエラー メッセージが表示されることがわかります。「Header had
all Ready send by」!ただし、ob_start を使用すると、エラー メッセージは表示されません。その理由は、バッファーが開かれたときに、echo 以降の文字がブラウザーに出力されず、flush を使用するまでサーバー上に出力されないためです。または ob_end_flush なので、
ファイルヘッダーの出力エラーは発生しません。


1. 関連関数の紹介:
1. フラッシュ: バッファーと出力の内容を更新します。
関数形式: flash()
説明: この関数は頻繁に使用され、非常に効率的です。

2. ob_start: 出力バッファを開きます。

関数形式: void ob_start(void)
説明: バッファがアクティブ化されると、PHP プログラムからのファイル以外のヘッダー情報はすべて送信されず、内部バッファーに保存されます。 。
バッファの内容を出力するには、ob_end_flush()またはflush()を使用してバッファの内容を出力できます。
3、ob_get_contents: 内部バッファの内容を返します。
使用法: string ob_get_contents(void)
説明: この関数は、出力バッファがアクティブ化されていない場合、現在のバッファの内容を返します。
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 を使用したことがある人なら誰でも、この文字列はバッファを開いたり閉じたりすることができます。
ob_implicit_flush 関数は、その関数と同じです。デフォルトでは、絶対出力をオンにした後、各スクリプト出力がブラウザに直接送信され、flush() を呼び出す必要はありません


2深い理解:

1. フラッシュ関数について:
この関数は、ブラウザのキャッシュを更新する非常に便利な関数です。
例 2.
------------------------------------------ ---------------------------------------------------- --
------ ------------------------
for($i = 1; $i // この文は非常に重要であり、キャッシュの構造は、そのコンテンツが一定のサイズに達した場合にのみブラウザーから出力できるようにします。キャッシュの内容が一定のサイズに達しない場合、プログラムの実行は完了しません。
// テストの結果、このサイズの下限は 256 文字であることがわかりました。これは、今後キャッシュによって受信されるコンテンツが
// 継続的に送信されることを意味します。
For($j = 1; $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 に情報を書き込みます
?> ---------------------------------------------------- ---- ----
上記の方法を使用すると、以前は不可能だったかもしれない、さまざまなユーザーの phpinfo 情報を保存できます。実は上記は一部の「処理」を「関数」に変換する方法なのです!

------------------------------------------------ --------------------------------------
-------------------------- --------- ------------------------
おそらく誰もが ob_start() の関数をある程度理解できたのではないでしょうか. 上記の例は簡単そうに見えますが、実際には
ob_start() の使い方の重要なポイントを理解しました。
<1>。ob_start を使用してブラウザのキャッシュを開きます。これにより、flush
()、ob_end_flush() を呼び出す前 (またはプログラムが実行される前) にキャッシュの内容が出力されなくなります。
<2>。これで利点がわかるはずです。出力コンテンツの後にヘッダー、setcookie、
session を使用できます。これは ob_start の優れた機能であり、キャッシュの作成後に ob_start のパラメーターも使用できます。書き込み後、

ob_start("ob_gzhandler"); などのコマンドを自動的に実行します。最も一般的に使用される方法は、 ob_get_contents() を使用してキャッシュ内のコンテンツを取得し、

それを処理することです...
<3> ;. 処理後は、flush()、ob_end_flush()、プログラム実行後の自動出力など、さまざまなメソッドを使用して出力できます。もちろん、ob_get_contents() を使用している場合は、出力メソッドを自分で制御する必要があります。

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

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

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

私が知っている静的出力を実現するには 2 つの方法があります:
<1>. 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)?> ;

====== ======================================== ========= =========================

PHP4.0 は、出力バッファ関数のコレクションを提供します。出力バッファリングのサポートにより、圧縮されたバッファーの周囲に関数をラップする関数を作成できます。 PHP4 の出力バッファリングのサポートにより、HTML 本文が出力されるかどうかに関係なく、HTML ヘッダー情報を保存できます。ただし、PHP では、header()、コンテンツ タイプ、Cookie はキャッシュされません。


PHP を使用するプロセスでは、必然的に header 関数と setcookie 関数を使用します。これら 2 つの関数はファイルのヘッダー情報をブラウザーに送信しますが、これら 2 つの関数を使用する前に出力 (空白を含む) がある場合は、 、出力 (スペース、キャリッジ リターン、ライン フィードなど) を使用するとエラーが表示されます。プロンプト情報は次のとおりです。「ヘッダーはすべての送信準備ができました。」 。

PHP4.0にはいくつかのバッファ制御関数が追加されました。

関数名 ob_start
関数形式 void ob_start(void)
機能: 出力バッファをオープンします。
注: バッファーがアクティブ化されると、PHP プログラムからのファイル以外のヘッダー情報はすべて送信されず、内部バッファーに保存されます。バッファの内容を出力するには、ob_end_flush() を使用するか、ob_end_clean() を使用してバッファの内容を出力します。

分析例:
1. バッファー制御関数を使用して、ファイルヘッダー内の情報の送信エラーを防ぎます。

ob_start(); //バッファを開く
echo "Welcome /n"; //ブラウザをリダイレクトして次へ.php
?>

ob_start が削除されると、PHP はファイルの 4 行目でエラー メッセージを表示しますが、ob_start を使用すると、エラー プロンプトは表示されません。理由 バッファがオープンされると、echo 以降の文字はブラウザには出力されず、サーバーのバッファに残ります。これらは、flush または ob_end_flush を使用するまで出力されないため、ファイル ヘッダーにあるエラーは発生しません。出力されました!

PHP4.0.4 には新しい出力キャッシュ ハンドラー ob_gzhandler があり、前のクラスに似ていますが、その使用法は異なります。 ob_gzhandler を使用する場合、以下が php.ini に追加されます:

output_handler = ob_gzhandler ;


このコード行により、PHP は出力キャッシュを有効にし、送信するすべてのものを圧縮します。何らかの理由で、このコード行を php.ini に追加したくない場合は、PHP ソース ファイルが配置されているディレクトリ内の .htaccess ファイルを使用して、デフォルトのサーバー動作 (圧縮なし) を変更することもできます。

php_value Output_handler ob_gzhandler


または、以下に示すように、PHP コードから呼び出します:

ob_start("ob_gzhandler")


キャッシュ ハンドルを出力するメソッドは確かに非常に効果的であり、サーバーへの特別な負荷。ただし、Netscape Communicator では圧縮グラフィックのサポートが不十分であるため、すべてのユーザーが IE ブラウザを使用していることを保証できない限り、圧縮 JPEG および GIF グラフィックを無効にする必要があることに注意してください。一般に、この圧縮は他のすべてのファイルに対して機能しますが、特に特別なプラグインやデータ ビューアを使用する場合は、ブラウザごとに個別にテストすることをお勧めします。

前に紹介したさまざまなテクニックを使用すると、Web サイトのパフォーマンスを大幅に向上させることができますが、次の点に注意してください:
PHP がパフォーマンスのボトルネックになる場合もあれば、そうでない場合もあります。データベースなど、アプリケーションのパフォーマンスに関連するあらゆる要素を注意深く観察してください。
この記事のテクノロジーを使用するだけでは、一定の制限内でのみ Web サーバーのパフォーマンスを向上させることができます。したがって、PHP とそのキャッシュを非難する前に、サーバーをアップグレードする必要があるかどうか、および負荷分散テクノロジを導入できるかどうかを検討してください (後者には多額の投資が必要です)。
コンテンツ圧縮の力を過小評価しないでください。 100 MB/秒の LAN 接続では Web アプリケーションが非常に速く応答することがわかりますが、モデム接続を使用しているユーザーは、100 Kb の HTML ページが大きすぎると不満を言うだけです。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート