Posted at

gzipファイルをphpでロードしてそのまま公開

More than 3 years have passed since last update.


生のtextを毎度圧縮するには忍びない場合に便利

今回はログファイルをgzに圧縮して貯めこんでるシステムを想定し、セキュアな環境でそのgzファイルを外からみたいなという状況を想定。

http://192.168.1.101/zcat.php?name=201606にアクセスすると/var/log/201606.log.gzが表示される感じを想定


コード


zcat.php

if(!isset($_GET['name']) || !is_file($_GET['name'])){

header('HTTP/1.0 400 Bad Request');
exit;
}
header('Content-Encoding: gzip');
readfile('/var/log/' . $_GET['name'] . '.log.gz');

危ないデータが入らない想定。不特定多数がアップロードしたファイルの展開表示は駄目。絶対。


トラブルシューティング


  • logファイルにapacheが参照できるよう権限設定が必要。

  • gzipをデコード出来ないブラウザ(ガラケーとか)は正しく表示できない。(諦めて)


仕組み

特に難しい仕組みでなく大半のブラウザはgzipで圧縮されたデータが読めるということで特に変換などせずに、

生のgzipファイルを適切なヘッダを付けて直接送ればブラウザは正しく読んでくれると言うだけである。


通信圧縮、キャッシング技術の世界は奥が深い

予め用意したgzをロードするというアプローチは使えそうだが商用環境だと余り出番は無い。

大半のデータはDBに格納されているし、キャッシングであれば強力なモジュールが幾つもあるからだ。

奥が深い領域には触れないが単にgzipで通信を圧縮するだけならApacheのmod_deflateというモジュールが有り、都度でかいテキストを配信するならこちらのモジュールを使用するのが適切だろう。