【PHP8.x】gzdeflate関数の使い方

作成日: 更新日:

『gzdeflate関数は、指定された文字列をDEFLATEアルゴリズムを用いて圧縮する処理を実行する関数です。この関数は、データ転送量を削減したり、ストレージ容量を節約したりする目的で、文字列データのサイズを小さくするために使用されます。第一引数には、圧縮したい文字列を指定します。第二引数には、圧縮レベルを0(無圧縮)から9(最大圧縮)までの整数で任意に指定できます。この値を大きくするほど圧縮率は高くなりますが、その分、処理にかかる時間が増加します。この引数を省略したり-1を指定したりした場合は、zlibライブラリのデフォルトの圧縮レベルが適用されます。処理が成功すると圧縮されたバイナリ文字列を返し、失敗した場合はfalseを返します。この関数によって生成されるデータは、zlibヘッダーやフッター情報を含まない生のDEFLATE形式です。圧縮されたデータを元の状態に戻す(解凍する)際には、対になるgzinflate関数を使用する必要があります。

基本的な使い方

構文(syntax)

<?php
$original_string = "Hello, this is a test string for gzdeflate.";
$compressed_data = gzdeflate($original_string);
?>

引数(parameters)

string $data, int $level = -1, int $encoding = ZLIB_ENCODING_DEFLATE

  • string $data: 圧縮するデータ。
  • int $level = -1: 圧縮レベルを指定する整数。-1から9までの値が指定でき、値が大きいほど圧縮率が高くなりますが、処理時間も増加します。デフォルト値は-1で、PHPのデフォルト圧縮レベルが使用されます。
  • int $encoding = ZLIB_ENCODING_DEFLATE: 圧縮に使用するエンコーディングを指定する整数。ZLIB_ENCODING_DEFLATE (デフォルト) または ZLIB_ENCODING_GZIP が指定できます。

戻り値(return)

string|false

圧縮された文字列を返します。圧縮に失敗した場合は false を返します。

サンプルコード

gzdeflate と gzcompress の違いを解説する

<?php

/**
 * gzdeflate と gzcompress の違いを示すサンプルコード.
 */
function demonstrateGzDeflateVsGzCompress(): void
{
    $data = "This is a sample string to demonstrate the difference between gzdeflate and gzcompress functions in PHP.";

    // gzdeflate を使用してデータを圧縮
    $deflated = gzdeflate($data, 9); // 9 は最高の圧縮レベル

    // gzcompress を使用してデータを圧縮
    $compressed = gzcompress($data, 9); // 9 は最高の圧縮レベル

    echo "Original data length: " . strlen($data) . "\n";
    echo "Deflated data length: " . strlen($deflated) . "\n";
    echo "Compressed data length: " . strlen($compressed) . "\n";

    // 出力された文字列を比較する。gzcompress は gzdeflate より 10 バイト長いヘッダー/フッターを追加する。
    echo "Deflated data: " . base64_encode($deflated) . "\n";
    echo "Compressed data: " . base64_encode($compressed) . "\n";

    // gzinflate を使用して deflate データを展開
    $inflated = gzinflate($deflated);

    // gzuncompress を使用して compress データを展開
    $uncompressed = gzuncompress($compressed);

    echo "Inflated data: " . $inflated . "\n";
    echo "Uncompressed data: " . $uncompressed . "\n";

    // 元のデータと展開されたデータが一致することを確認
    echo "Deflate/Inflate match: " . ($data === $inflated ? "true" : "false") . "\n";
    echo "Compress/Uncompress match: " . ($data === $uncompressed ? "true" : "false") . "\n";
}

demonstrateGzDeflateVsGzCompress();

PHP 8.4 の gzdeflate 関数は、文字列 $data をdeflateアルゴリズムで圧縮します。gzcompress関数との違いは、gzdeflate が raw なdeflateストリームを生成するのに対し、gzcompress は zlib 形式のヘッダーとフッターを付加することです。

gzdeflate の第一引数 $data には圧縮したい文字列を指定します。第二引数 $level は圧縮レベルを 0 から 9 の整数で指定します。0 は圧縮なし、9 は最高の圧縮率を示し、デフォルト値は -1 です。第三引数 $encoding はエンコーディング方式を指定します。デフォルトは ZLIB_ENCODING_DEFLATE です。

戻り値は、圧縮された文字列を返します。エラーが発生した場合は false を返します。

サンプルコードでは、gzdeflategzcompress で同じ文字列を圧縮し、それぞれの圧縮後のデータ長を比較しています。gzcompress の方がヘッダー/フッターの分だけデータ長が長くなります。また、gzdeflate で圧縮したデータは gzinflate で、gzcompress で圧縮したデータは gzuncompress で展開できることを示しています。最後に、展開されたデータが元のデータと一致するかどうかを確認しています。gzdeflate は、より小さいファイルサイズが必要で、zlibヘッダーが不要な場合に適しています。

gzdeflate関数とgzcompress関数の主な違いは、圧縮データの形式です。gzdeflateは生のdeflate形式で圧縮しますが、gzcompressはzlib形式で圧縮し、ヘッダーとチェックサムが付加されます。そのため、gzcompressの方がわずかにデータサイズが大きくなります。

gzdeflateで圧縮したデータはgzinflateで、gzcompressで圧縮したデータはgzuncompressで展開する必要があります。圧縮レベルは0から9の範囲で指定でき、9が最も高い圧縮率ですが、処理時間も長くなります。デフォルト値の-1は、zlibライブラリのデフォルト設定を使用します。

圧縮・展開処理では、メモリを大量に消費する可能性があるため、特に大きなデータを扱う際には注意が必要です。また、圧縮・展開に失敗した場合、これらの関数はfalseを返すため、戻り値のチェックを必ず行ってください。

【PHP8.x】gzdeflate関数の使い方 | いっしー@Webエンジニア