PizG
gzip 圧縮転送をお手伝い
PHP 4.0.4
PizG について
PizG とはファイルの gzip 圧縮転送のサポートをすることを目的に作られました。
- CSS, JS 等の外部ファイルを圧縮転送したい
- HTML, TXT 等を圧縮転送したい
- 圧縮済みファイルを転送したい
といったことが可能で、プレーンテキストを gzip 圧縮した場合圧縮率は 70% 程を期待できるため 転送量が気になる方や大き目のファイルを扱う方には特にお勧めです。
!! 基本的に中身がテキストであるファイルに対して最も有効であり、 画像などのバイナリに対して使うのは激しく愚かな行為です。
!! リクエスト数があまりにも多い場合、 このスクリプトがサーバに負荷をかけることにもなるということを忘れないでください。
DownLoad
使い方
あるファイルに対して圧縮転送を行うには
pizg.php?f=common.css
「 f=対象のファイル 」というようにします。
e.g.
<link rel="styleSheet" type="text/css" href="pizg.php?f=common.css">
圧縮済みファイルを転送するには
まず未圧縮ファイルと gzip 圧縮済みファイルの2つを用意し同じディレクトリに 同じファイル名(拡張子は別)で置きます。 これは圧縮転送を未サポートのクライアント対策です。 で、
pizg.php?f=target.gz&s=pdf
と「 f=対象のファイル 」に続き 「 s=拡張子 」として呼び出します。 ここでいう拡張子とは圧縮前のものです。
e.g.
<a href="pizg.php?f=target.gz&s=pdf">PDF</a>
もし圧縮前のファイル名が「README」(仮に)で拡張子が無くても 中身が PlainText なら拡張子は txt とします。
e.g.
pizg.php?f=readme.gz&s=txt
パスについて
パスはルートからの絶対パスです。例えば
http://127.0.0.1/user/js/hello.js
が対象のファイルなら
<script type="text/javascript" src="pizg.php?f=%2fuser%2fjs%2fhello.js"></script>
ということです ( %2f はスラッシュ " / " を URL Encode したものです ) 。 ファイルが pizg.php と同じディレクトリに在る場合はファイル名のみでかまいません。
e.g.
pizg.php?f=sample.html
キャッシュ制御について
デフォルトでキャシュの有効期限は一日にしていますが もしクライアントにキャッシュさせたくないのであれば
e.g.
pizg.php?f=hello.html&c=
と「 c= 」を足してください。 (「 c=1 」と値をいれてもかまいません。"c" があることが重要です。)
サポートするファイルタイプ
対応しているファイルタイプは HTML, CSS, JS, PDF, TXT です。 これ以外は全て PlainText 扱いになります。 もし任意のファイルタイプを扱いたい場合はソース中に Content-type と拡張子を記述する必要があります。 ( ブラウザの中には Content-type を無視して勝手に解釈しようとするものもありますが (例えば IE)まともなブラウザはそんなことしませんので適切な Content-type をレスポンスヘッダに含めることが必要となります )
余談
本当に圧縮転送されているか確かめたい
そんな時は当サイトにある GettEr lieGeR を使います。サンプルとして設置してある のでそちらを使って下さい。
使い方は
- URL に例えば http://127.0.0.1/pizg.php?f=test.html と入力します。
- METHOD を HEAD ( べつに GET でもかまいませんが ) にする
- HEADER に Accept-Encoding: gzip と入力。
- 送信
すると以下のような結果が表示されます。
GET /kerry/pizg/pizg.php?f=test.html HTTP/1.1 Host: 127.0.0.1 Accept-Encoding: gzip /* ------------------------------------- */ HTTP/1.1 200 OK Date: Sun, 26 Dec 2004 17:18:33 GMT Server: Apache/1.3.29 (Win32) PHP/4.3.9 X-Powered-By: PHP/4.3.9 Expires: Mon, 27 Dec 2004 17:18:33 GMT Cache-Control: must-revalidate Cache-Control: max-age=86400 Cache-Control: s-maxage=86400 Content-Encoding: gzip Vary: Accept-Encoding Transfer-Encoding: chunked Content-Type: text/html
線(ハイフンの連続)より上が相手サーバに送ったリクエストヘッダで、 下が相手サーバからのお返事のレスポンスヘッダです。 レスポンスヘッダのみ読んでいきます。
まず HTTP/1.1 200 OK とステータスをみます。 300, 400台なら URL が間違っています。
次に Content-Encoding: gzip があるか見てください。 あれば gzip 圧縮転送が行われたことを意味します。 無ければリクエストヘッダに Accept-Encoding: gzip が有るか、スペルミスや全角文字が入っていないか確認し再試行してみてください。
また、METHOD を HEAD ではなく GET にするとバイナリが文字化けとなって 表示されます。これは GettEr lieGeR が解凍を行わない為です。 通常はブラウザが勝手に解凍してくれますので気にしなくてよいです。 リクエストヘッダに Accept-Encoding: gzip を入力せず 同じようにリクエストして結果を比較してみるとより実感できるかもしれません。
単純に HTML を圧縮転送させたいだけなら
- まず HTML の拡張子を PHP にする。
- 次にファイルの先頭に以下のコードを記述する
<?php ob_start ( "ob_gzhandler" ); ?>
- 上書き保存する
・・・とコレだけのことです。簡単に説明すると ob_start は出力をバッファリングをしろという関数で ob_gzhandler はクライアントが圧縮転送をサポートするなら そうしろ、ということです。
言うまでもないでしょうがバッファリングするのでそれ相応のメモリを喰います。 勿論 CPU も。
単純に圧縮済みファイルを転送するなら
- まず圧縮済みファイルの拡張子を PHP にする。
- 次にファイルの先頭に以下のコードを記述する( Content-type は適切なものを )
<?php header ( "Content-encoding: gzip" ); header ( "Content-type: text/html" ); ?>
この時空白や改行コード等の余計な文字が入らないように気をつけます。 また、テキストエディタによってはデータ(バイナリ) を壊してしまうものがあるかもしれません。注意してください。 - 上書き保存する
・・・とこれだけです。 が、実際にはもう少しクライアントのことを考えコーディングしなければ 実用は避けるべきでしょう。
PDF について
PDF ファイルについても事前に圧縮しておくことでファイルサイズを抑えることが可能です。 勿論モノによりますが大きくなりがちな PDF ファイルに対して有効である場合が多いのも事実です。
Copyright(C) 2002-2004 kerry.