Zend Frameworkでob_gzhandlerを使用する。

Firebug用YSlowプラグインが出たことにより、またhttpレスポンス圧縮の話題が再燃しているような気がします。(参考
Apache側でmod_gzip,mod_deflateが設定できれば良いのですが、レンタルサーバなどでは設定できないことが多いです。そういった場合にはPHPでアウトプットを圧縮して送信することができます。方法としては主に

  • php.iniの設定でzlib.output_compression を有効にする。
  • ob_start()のコールバック関数 ob_gzhandler を使用する。

があります。

zlib.output_compressionに関してはとても簡単で、php.iniに

zlib.output_compression = On

の行を入れるだけです。おそらくコメントアウト状態で入っているので、

#zlib.output_compression = Off

コメントアウトを外し、OffをOnに変更するのが簡単です。
これで通常のPHP出力は、圧縮されてクライアントに送信されます。
#この設定はzlib 拡張モジュールがPHPに組み込まれている必要があります
また、zlib.output_compression_level というものがあり、これで圧縮率を変更できるようです。

zlib.output_compression_level = 1

ただ、この設定は(マニュアルを確認すると)変更の可否がPHP_INI_ALLとなっているものの、スクリプト上から変更できない場合があります。
(php.iniで zlib.output_compression = On にされているものをスクリプトでOffにすることはほとんどの場合で可能なようですが・・・)
その場合は ob_gzhandlerを使うしかありません。

Zend Frameworkの出力はob_start()で制御されています。
ob_gzhandlerを使用するには、
[php]
ob_start(“ob_gzhandler”);
[/php]
と、ob_startの引数としてコールバック関数名(ob_gzhandler)を渡すのですが、Zend Frameworkのどこに埋め込みましょう?
使用している箇所はディスパッチャの中ですが、しかし、Zend Framework本体に手を入れるのはあまり好ましくありません。(まだまだバージョン更新が激しいですから:-) 。仕様もいつガラっと変えてくるかわかりません)
じゃあ、ob_startまわりを継承、委譲して作る、というのもよいのですが、ob_start()のマニュアルを見てみると、

出力バッファはスタッカブルであり、このため、他の ob_start() がアクティブの間に ob_start() をコールすることが可能です。この場合、 ob_end_flush() を適切な回数コールするようにしてください。 複数の出力コールバック関数がアクティブの場合、 ネストした順番で逐次連続的に出力がフィルタ処理されます。

とありますので、起動ファイルでDispatchに渡す前にob_startしてしまいましょう。
[php]
ob_start(“ob_gzhandler”);
Zend_Controller_Front::run(‘/path/to/app/controllers’);
[/php]

無事、圧縮されましたでしょうか。

Leave a comment ?

14 Comments.

  1. Zend Framework内でSmartyを使っていれば、Smarty中でもob_start()が走っていますね。

  2. Ambien cr. - trackback on 2010/10/8 金曜日 at 20:43:10
  3. 単に したい欲望あなたの記事のようにあると言う驚くべき。 | 単にあなたのポストで鮮明透明性がある クールと私は可能性 |この主題の専門家あなたがしているあなたがあると仮定します。 ファイン今後のポストに| 更新日まで保つために| | フィードRSSフィード私はあなたをつかむためにあなたの許可を持つましょう許可。おかげで百万と継続 お願い喜ばしい仕事。あなたは私の心を読んで、そのような

  4. 私は好き。おそらく、あなたはこれを続けることができましたか?このトピックでは、非常にほとんどの人々のためにイライラされるのに対し

  5. は私の友人からこのウェブサイトを聞きました。彼はここに私を指摘し、私は私が必要なものを見つけるだろう私を知らせました。彼は正しかったです!私は私が持っていたすべての質問を取得し、答えました。でも、それを追求する時間はかかりませんでした。あなたは私のような個人のためのそれはそう単純で行われているという事実を崇拝。

  6. !私はしばらくの間、良好なインターネットビジネスのアイデアを思い付くしようとしてきました。その代わりに、私は多くはそれが始めるためにことを必要としない場合があります完全なインターネットベースのビジネスとは対照的に、このアイデアは、たくさんのお金を必要とするための種類の方法で吸う大きな非インターネットビジネスのアイデア、が出ています。でも、私はあきらめていませんよ。私は最近、私は私の会社を開始するために私の手順を文書化する予定のブログを開始しました。私はそれがやる気に私を維持し、それを維持するために私を強制すると考えました。私もそれが自分の目標を達成しようとして維持するために読者に動機を与えることを願っています。ところで、私はあなたのサイトが大好きです。私は面白いブログの私のリストに追加されます。カルメン@

  7. 私の仲間が私のためにこのブログをブックマークして、私は過去数時間のためにそれを通過してきました。これは本当に私たちのクラスのプロジェクトのために私と私の友人の利益のために起こっています。ところで、私はあなたが書く方法をお楽しみください。

  8. 。彼らのようなスパムメッセージの怒りのライターは、消費者を困らせる場合、私は疑問に思っていますか?私は心から思考のこのコレクションは無期限スパムなしで残ることを希望に対して期待しています。ご入力いただき、ありがとうございます。私はあなたの仕事に感謝します。こんにちは

  9. 。 明らかにこの上の時間たくさんの あなたが持っている可能性があります。 素敵やりました!既に知っているこの問題に関する知識の豊富な人々を探し出しすることが面倒

  10. ?何育てたり議論さNEVEするために使用することは変更されました。率直に言って、それは私たちが変化を見る時間についてです。

  11. 兄は私でしょう、おそらくこのよう提案しました。彼はかつて完全に適切な右でした。これは、提出真 作成製。私はこのために費やしていた時間詳細あなたはどのように 信じることができません!ありがとう! 述べており、いくつかの珍しいケースでは、自殺はかもしれない起こる。何

  12. !彼らはハッカーから保護するために、任意のプラグインを作る場合、あなたは知っていますか?私は上に懸命に働いてきたすべてのものを失うことについてちょっと偏執的です。任意の提言?これについて認識へのバンドルが顕著にあり

  13. こんにちは私の友人)=ありがとうございます!私はこのポストであることを言いたい顕著、良い書かれており、含む約すべての重要なに関する情報。 はるかに多くをこのような記事を私が見てみたいと思います。

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Trackbacks and Pingbacks: