gzip転送を試してみた

Webページの表示を速くする方法の1つとして、HTML等のファイルをgzipで圧縮して転送する方法があります。
gzip転送に対応させる方法はいくつかありますが、PHPを使って簡単な実験を行ってみました。

ob_gzhandlerでgzip圧縮する

PHPには、出力をバッファリングする関数群があります(ob_startなど)。
また、その関数群の1つに、バッファリングした結果をgzip圧縮する「ob_gzhandler」という関数があります。
PHP化したHTMLのページで、その先頭と最後に以下のような記述を追加することで、gzip転送を行うことができます。

<?php ob_start("ob_gzhandler"); ?>
元のHTMLの内容
<?php ob_end_flush(); ?>

gzip圧縮の効果

上のPHPのコードでは、ページにアクセスがあるたびに、HTMLをgzip圧縮します。
そのため、サーバー側の処理時間が若干伸びます。

一方、サーバーからWebブラウザに送信されるデータは、圧縮によってサイズが減ります。
そのため、サーバーからの送信時間は短くなります。

試しに、当ブログのトップページで、gzip圧縮の効果を調べてみました。
Google Chromeのデバッグ機能の「Network」を使い、HTMLを受信する際の「Waiting」と「Receiving」の時間を測定しました。
「Waiting」は、HTTPリクエストを送信してから、HTMLが送られ始めるまでの時間で、サーバー側の処理にかかった時間を意味します。
また、「Receiving」は、HTMLを受信し終わるまでにかかった時間です。

gzip圧縮あり/なしで10回ずつページを読み込んで、Waiting/Receivingの平均を求めると、以下のような結果が得られました。
なお、表内の単位はミリ秒(=1,000分の1秒)です。

 WaitingReceiving合計
gzip圧縮なし38.1101.8139.9
gzip圧縮あり44.028.472.4
+5.9-73.4-67.5

前述したように、gzip圧縮するとサーバー側の処理が増えますので、gzipありの方がWaitingの時間が長くなっています。
一方、通信するデータの量は減りますので、Receivingの時間は短くなっています。
上の結果では、Waitingの増加はわずか(約6ミリ秒)であるのに対し、Receivingの減少は大きいです(約73ミリ秒)。
差し引きで約67ミリ秒の時間を短縮することができています。

今回の実験では、HTMLファイルだけgzip転送したので、短縮できた時間はそれほど大きくはありません。
しかし、CSSやJavaScriptのファイルもgzip転送すれば、より効果が得られるはずです。