ホームページ >バックエンド開発 >PHPチュートリアル >[転送]PHP ob_start() と ob_gzhandler()
出力制御機能を使用すると、スクリプト内のデータの出力を自由に制御できます。これは、特にデータの出力後にファイルヘッダーを
出力したい場合に非常に便利です。出力制御関数は、header() または setcookie()
を使用して送信されるファイル ヘッダー情報には影響しませんが、echo() や PHP コードと同様のデータ ブロックにのみ影響します。
出力制御の一般的な印象を与えるために簡単な例を示しましょう:
例 1.
------------------------ -------------------------------------------------- -- ---------------
----------------------------- --
ob_start(); // バッファを開く
echo "Hellon"; // 出力
header("location:index.php") // ブラウザをindex.phpにリダイレクトする
ob_end_flush () ;//すべてのコンテンツをブラウザに出力します
?>
---------------------------------- ------ -------------------------------------------- ------
----------------------------------
header() 関数を知っている人は、この関数がファイル ヘッダーをブラウザに送信することを認識していますが、この関数を使用する前に出力 (スペース、復帰、改行などの空の出力を含む) がある場合は、エラーが表示されます。最初の行の 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() または flash() を使用してバッファの内容を出力できます。
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 を使用したことがある人なら誰でも、$│=x の意味を知っています。
ob_implicit_flush 関数は、その関数と同じです。デフォルトでは、絶対出力をオンにした後、各スクリプト出力がブラウザに直接送信され、
flash() を呼び出す必要はありません
2。深い理解:
1. フラッシュ関数について:
この関数は、ブラウザのキャッシュを更新する非常に便利な関数です。
例 2.
------------------------------------------- --------------------------------------------------
------- -----------------------------
for($i = 1; $i // この文は非常に重要であり、そのコンテンツは特定のサイズに達した場合にのみブラウザから出力されます。つまり、キャッシュの内容が一定のサイズに達しないと、プログラムの出力は完了しません。
// テストの結果、このサイズの下限は 256 文字であることがわかりました。これは、今後キャッシュによって受信されるコンテンツが
// 継続的に送信されることを意味します。
For($j = 1; $j echo $j.”;
flash(); // この部分は、キャッシュ内の新しいコンテンツを取り出して表示します。ブラウザに移動します
sleep(1); // プログラムを 1 秒間「スリープ」させます。これにより、効果をより明確に確認できるようになります
?> ----------- -------------------------------------------------- -- -----------------------
------------------------ ---- ------
注: ob_implicit_flush() をプログラムの先頭に追加して絶対リフレッシュをオンにすると、プログラム内でフラッシュ
() を使用できなくなります。これには次の利点があります。効率を向上させます!
2. ob シリーズの関数について:
まずは私の友人 y10k の例を引用したいと思います:
例 3.
-------------------- --- --------------------------------------------------- --- -------------
例えば、サーバーとクライアントの設定情報を使用できますが、この情報はクライアントによって異なります。 phpinfo() 関数の出力を保存したい場合はどうすればよいでしょうか。バッファ制御が存在しない前は、まったく方法がなかったと言えますが、
バッファ制御を使用すると、問題を簡単に解決できます。
----------------- ----------------------------------------------------
ob_start(); //バッファリング領域を開く
$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
<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 ページが更新されなくなると、別のユーザーがこのページを再度閲覧したときに、プログラムは
私が知っている静的出力を実現するには 2 つの方法があります:
. 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); >
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. バッファー制御関数を使用して、ファイルヘッダー内の情報送信時のエラーを防ぎます。
//PHP プロンプト
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 ページが大きすぎると不満を言うだけです。