PHPでgzip圧縮形式(gz圧縮)のファイルを読み書きする方法

gzファイル形式の圧縮はzipファイルなどとは異なり、1ファイル単位での圧縮になります。
圧縮することによってファイル容量を50〜80%ぐらいに圧縮することが可能です。
このため保存する出力ファイルが多い場合にはデータ容量軽減に効果的です。
[参考記事] ファイルを読み込む/ファイルに書き込む

gzファイルを読み込む

<?php
// 対象のファイル
$target="test.txt.gz";

ob_start();
readgzfile($path);
$contents = ob_get_clean();
?>
<?php
// 対象のファイル
$target="test.txt.gz";

$zd = gzopen($target, "r");
$contents = gzread($zd, 10000);
gzclose($zd);
?>

gzファイルに書き込む

Linuxサーバなどでは、webアクセスされた時のファイルの書き込みユーザはapacheなどになり、FTP等のユーザと違う場合があります。
このファイルはファイルの削除変更などがFTP経由でできなくなります。
このためファイルを書き込んだら、パーミッションを777などに変更しておいたほうがいいです。

[参考記事] ディレクトリ内のファイルのパーミッションを一括で変更する

<?php
// 対象のファイル
$target="test.txt.gz";

// ファイルハンドルを書き込みモードで開く
if(!$gz = gzopen($target,'w1')){
  exit;
}
//ファイルに書き込む
gzwrite($gz, $data);
//ポインタを閉じる
gzclose($gz);

// パーミッションを変更する
@chmod($target, 0777);
?>

書き込みモードの指定はw1からw9が指定可能で、数字が大きいほど圧縮率が高く、出力されるファイル容量が小さくなります。

webサイトのレスポンスをgzip圧縮する

転送量軽減のためにwebサイトのHTMLなどをgzip圧縮して返すにはphp.iniの設定で可能です。
この場合、サーバ側でページを圧縮して、ブラウザ側で展開することになるのでページの表示がわずかですが遅くなります。
またページの表示ごとに圧縮を行うのでサーバ負荷がかかります。

AmazonEC2の転送量課金やプロバイダの30GB制限などがある場合には効果的です。

ブラウザからのリクエストのAccept-Encodingにgzipが指定されていた場合には自動的にgzip圧縮し『Content-Encoding: gzip』を付与してレスポンスを返します。

php.ini

zlib.output_compression = On

関連記事

スポンサーリンク

SVNリポジトリを別のサーバに移行する方法

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る