CXXIV. zlib圧縮関数

導入

このモジュールによりgzip (.gz)で圧縮されたファイルを読み書きする ことが可能となります。 この際、ファイルシステム関 数のgzip圧縮対応版(非圧縮ファイルも扱えますが、ソケットは扱えませ ん)を使用します。

注意: バージョン4.0.4-devで.gzファイルに対応したfopen-wrapperを導入しました。 これによりfopen()に'zlib:'をプレフィクスとした ファイル名又はパス名を渡すことで、通常のf*()関数で圧縮されたファイルに 透過的にアクセスすることが出来ます。

4.3.0において、';'を含むファイル名との曖昧さを避けるためこの特別 なプレフィックスは'zlib://'に変更されました。

この機能を利用するにはfopencookie()関数を提供する Cのランタイムライブラリが必要です。現在私の知る限りでは、GNU libcが この機能を提供する唯一のライブラリです。

要件

このモジュールは、Jean-loup Gailly および Mark Adler による zlib の関数を使用します。 このモジュールを使用するには、zlib バージョン 1.0.9 以上を 使用する必要があります。

インストール手順

PHPにおけるZlibサポートは、デフォルトでは利用できません。 Zlibサポートを有効にするには、PHPのコンパイル時にconfigureの オプションに--with-zlib[=DIR]を 指定してコンパイルする必要があります。

Windows版のPHPには この拡張モジュールのサポートが組み込まれています。これらの関数を使用 するために拡張モジュールを追加でロードする必要はありません。

注意: PHP 4.3.0 以降、zlib モジュールは php バイナリにビルトインされています。

実行用の設定

これらの関数の動作は、php.iniの設定により変化します。

zlib拡張モジュールは、ブラウザがサポートする場合にページを透過的に圧 縮するオプションを提供します。 ここで、 設定ファイル php.ini のオプションには、以下の3種類があります。

表 1. Zlib設定オプション

名前デフォルト変更の可否
zlib.output_compression"Off"PHP_INI_ALL
zlib.output_compression_level"-1"PHP_INI_ALL
zlib.output_handler""PHP_INI_ALL
PHP_INI_*定数の定義と詳細については、 ini_set()を参照して下さい。

以下に設定ディレクティブに関する簡単な説明を示します。

zlib.output_compression boolean/integer

透過的なページ圧縮を行うかどうか。php.iniまたはApacheの設定で このオプションが、"On"に設定された場合、 ブラウザが"Accept-Encoding: gzip"または"deflate"ヘッダを送信する 場合に、ページは圧縮されます。 "Content-Encoding: gzip" (および"deflate")と"Vary: Accept-Encoding"ヘッダが出力に追加されます。

ヘッダが未送信の場合、スクリプト内でこのオプションを無効にするた めにini_set()を使用することが可能です。 "Content-Type: image/"ヘッダを出力した場合、(Netscapeのバグのせ いで)圧縮が無効となります。 image content-typeを追加するヘッダコールの後、 "ini_set('zlib.output_compression', 'On')"を追加した場合、 再度有効にすることができます。

このオプションも論理値"On"/"Off"のかわりに整数値をとることができ、 これを用いて出力のバッファサイズ(デフォルトは4KB)を設定すること ができます。

注意: このオプションに'On'を設定した場合、 output_handlerを空に する必要があります! かわりにzlib.output_handlerを使用する必要が あります。

zlib.output_compression_level integer

透過的出力圧縮で使用される圧縮レベル。

zlib.output_handler string

zlib.output_compressionが有効な場合に他の出力ハンドラを指定する ことはできません。この設定は、 output_handlerと同じですが、順番が異なります。

簡単なコードの例

テンポラリファイルをオープンし、テスト用文字列を書きこみ、 続いて、このファイルの内容を2回出力します。

例 1. 簡単な Zlib の例

<?php
$filename
= tempnam ('/tmp', 'zlibtest').'.gz';
print
"<html>\n<head></head>\n<body>\n<pre>\n";
$s = "Only a test, test, test, test, test, test, test, test!\n";
// 最大限の圧縮を指定して書きこみ用にファイルをオープン
$zp = gzopen ($filename, "w9");
// 文字列をファイルに書きこむ
gzwrite ($zp, $s);
// ファイルを閉じる
gzclose ($zp);
// 読みこみ用にファイルをオープン
$zp = gzopen ($filename, "r");
// 3文字読みこむ
print gzread ($zp, 3);
// ファイルの終端まで読み、閉じる
gzpassthru ($zp);
print
"\n";
// ファイルをオープンし、内容を出力する (2回目)。
if (readgzfile ($filename) != strlen ($s)) {
        echo
"Error with zlib functions!";
}
unlink ($filename);
print
"</pre>\n</h1></body>\n</html>\n";
?>
目次
gzclose -- 開かれたgzファイルへのポインタを閉じる
gzcompress -- 文字列をdeflate圧縮する
gzdeflate -- 文字列を deflate 圧縮する
gzencode -- gzip 圧縮された文字列を作成
gzeof -- gz ファイルポインタにおいてファイル終端を調べる
gzfile -- gzファイル全体を配列に読み込む
gzgetc -- gz ファイルへのポインタから文字を得る
gzgets -- ファイルポインタから 1 行を得る
gzgetss --  gzファイルへのポインタから1行を得て、HTMLタグを取り除く
gzinflate -- deflate圧縮された文字列を解凍する
gzopen -- gz ファイルを開く
gzpassthru --  gzファイルへのポインタから残りのデータ全部を出力する
gzputs -- gz ファイルへのポインタに書き込む
gzread -- バイナリ対応のgzファイル読み込み
gzrewind -- gz ファイルポインタの示す位置を元に戻す
gzseek -- gz ファイルポインタの位置を移動する
gztell -- gzファイルポインタの読み込み/書き込み位置を返します
gzuncompress -- deflate圧縮された文字列を解凍する
gzwrite -- バイナリ対応のgzファイル書き込み
readgzfile -- gz ファイルを出力する
zlib_get_coding_type -- Returns the coding type used for output compression