PHP
JSON
gzip

jsonを圧縮して送ろう

とあるソフトを開発していたとき。

サーバー側はPHP、クライアントはC#だった。画面に表示するデータのほとんどはPHP側が出力し、JSONでやりとりを行う構成。

ある画面で10000件くらいの大量の項目を転送する必要があった。ふつうに送るとさすがに容量が大きいもんですから遅くてあまりレスポンスが良くなかったので、どうしたもんかいのーと考えていたらgzipで圧縮して転送するというナイスな方法を見つけました。


Gzipの効果を見てみよう

こんなPHPを作ってみた。

<?php

$results = [];
for ($i = 0; $i < 10000; $i++) {
$results[] = ["id" => md5($i)];
}
echo json_encode($results);

10000個のデータを作って返す、内容はmd5で生成しています。

これがだいたいどのくらいの容量になるのか。

410KBでした。

さあこれをGzipで圧縮して送ってみましょう。

圧縮するには以下のob_start("ob_gzhandler")を呼び出すだけです。

<?php

$results = [];
for ($i = 0; $i < 10000; $i++) {
$results[] = ["id" => md5($i)];
}

ob_start("ob_gzhandler"); // <-

echo json_encode($results);

なお、使用するにはZlibモジュールとやらが必要になるそうです。

http://php.net/manual/ja/function.ob-gzhandler.php

クライアント側もgzipに対応している必要があるのですが、C#のHttpClientは以下のサイトを参考にすれば対応することができますよ。

https://sqlazure.jp/r/%E6%9C%AA%E5%88%86%E9%A1%9E/559/

では結果をみてみましょう。

197KBになる、だいたい半分くらいになりました。

今回はmd5でランダムなデータを作ったんですが、繰り返しが多いデータだったらもっと圧縮率が高くなると思います。