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

作成日: 更新日:

gzcompress関数は、与えられた文字列を指定されたレベルで圧縮する関数です。この関数は、DEFLATE圧縮アルゴリズムを用いてデータを圧縮し、圧縮された文字列を返します。主にデータ量を削減し、ストレージ容量の節約やネットワーク転送の高速化に役立ちます。

gzcompress関数は、以下の引数を受け取ります。

  1. $data (string): 圧縮対象となる文字列データです。必須の引数です。
  2. $level (int, オプション): 圧縮レベルを0から9の範囲で指定します。0は圧縮を行わず、9は最大の圧縮率を意味します。デフォルト値は-1で、zlibライブラリのデフォルト圧縮レベルが使用されます。
  3. $encoding (int, オプション): エンコーディング方式を指定します。ZLIB_ENCODING_RAW (負の値) を指定すると、zlibヘッダやtrailerが付加されないRawストリームを生成します。ZLIB_ENCODING_DEFLATE (正の値) を指定すると、RFC 1951に準拠したdeflate形式で圧縮されます。ZLIB_ENCODING_GZIP (0)を指定すると、RFC 1952に準拠したgzip形式で圧縮されます。デフォルト値は ZLIB_ENCODING_DEFLATE です。

圧縮に失敗した場合、gzcompress関数は false を返します。正常に圧縮された場合は、圧縮された文字列が返されます。圧縮レベルを調整することで、圧縮時間と圧縮率のバランスを調整できます。ウェブアプリケーションにおけるデータ転送や、ファイルストレージにおけるデータ圧縮など、様々な場面で利用される関数です。

基本的な使い方

構文(syntax)

gzcompress(string $data, int $level = -1, int $encoding = ZLIB_ENCODING_DEFLATE): string|false

引数(parameters)

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

  • string $data: 圧縮したい文字列データ
  • int $level = -1: 圧縮レベルを指定します。-1 はデフォルト値で、ZLIB_DEFAULT_COMPRESSION に相当します。値は 0 (圧縮なし) から 9 (最大圧縮) まで指定できます。
  • int $encoding = ZLIB_ENCODING_DEFLATE: 使用するエンコーディングを指定します。デフォルトは ZLIB_ENCODING_DEFLATE です。

戻り値(return)

string|false

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

サンプルコード

PHPでgzcompress/gzuncompressを使う

<?php

/**
 * 文字列を圧縮し、圧縮された文字列を返します。
 *
 * @param string $data 圧縮する文字列
 * @return string|false 圧縮された文字列。失敗した場合は false。
 */
function compress_data(string $data): string|false
{
    // 圧縮レベルを指定 (省略した場合はデフォルトの圧縮レベルが使用されます)
    $compressed_data = gzcompress($data);

    if ($compressed_data === false) {
        return false; // 圧縮に失敗した場合
    }

    return $compressed_data;
}

/**
 * 圧縮された文字列を解凍し、元の文字列を返します。
 *
 * @param string $compressed_data 解凍する文字列
 * @return string|false 解凍された文字列。失敗した場合は false。
 */
function uncompress_data(string $compressed_data): string|false
{
    // 圧縮されたデータを解凍
    $uncompressed_data = gzuncompress($compressed_data);

    if ($uncompressed_data === false) {
        return false; // 解凍に失敗した場合
    }

    return $uncompressed_data;
}

// 使用例
$original_string = "This is a string to be compressed and uncompressed.";

// 圧縮
$compressed_string = compress_data($original_string);

if ($compressed_string !== false) {
    echo "圧縮後の文字列: " . base64_encode($compressed_string) . "\n"; // バイナリデータを表示するためにbase64エンコード

    // 解凍
    $uncompressed_string = uncompress_data($compressed_string);

    if ($uncompressed_string !== false) {
        echo "解凍後の文字列: " . $uncompressed_string . "\n";
    } else {
        echo "解凍に失敗しました。\n";
    }
} else {
    echo "圧縮に失敗しました。\n";
}

?>

PHPのgzcompress関数は、文字列を圧縮するために使用されます。第一引数 $data に圧縮したい文字列を渡します。第二引数 $level で圧縮レベルを0から9の間で指定できます。省略した場合、デフォルトの圧縮レベルが使用されます。圧縮レベルが高いほど圧縮率は上がりますが、処理時間も長くなります。第三引数 $encoding は圧縮形式を指定します。通常は ZLIB_ENCODING_DEFLATE が使用されます。

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

サンプルコードでは、compress_data 関数で文字列を圧縮し、uncompress_data 関数で圧縮された文字列を解凍しています。圧縮されたデータはバイナリデータであるため、画面に出力する際は base64_encode 関数でエンコードしています。

gzuncompress 関数は、gzcompress 関数で圧縮された文字列を解凍するために使用されます。引数に圧縮された文字列を渡すと、元の文字列が返されます。解凍に失敗した場合は false を返します。

サンプルコードでは、圧縮と解凍が成功したかどうかを if 文で確認し、結果に応じてメッセージを出力しています。

gzcompress関数は文字列を圧縮する関数です。圧縮レベルは省略可能で、-1を指定するとデフォルトの圧縮レベルが使用されます。圧縮に失敗するとfalseを返すため、必ず返り値を確認しましょう。圧縮されたデータはバイナリデータとなるため、そのまま表示すると文字化けする可能性があります。base64_encode関数などでエンコードしてから表示することを推奨します。また、gzuncompress関数で解凍する際も、失敗時にfalseが返るため、エラーハンドリングを忘れないようにしましょう。圧縮・解凍処理はCPU負荷が高くなる可能性があるため、大量のデータを扱う場合は注意が必要です。

PHPのgzcompressとgzdeflateを比較する

<?php

/**
 * gzcompress, gzdeflate の比較サンプル.
 */

$data = "This is a test string to be compressed.";

// gzcompress を使用してデータを圧縮.
$compressed_data_compress = gzcompress($data, 9); // level 9 は最高の圧縮率.

// gzdeflate を使用してデータを圧縮.
$compressed_data_deflate = gzdeflate($data, 9); // level 9 は最高の圧縮率.

// 圧縮されたデータのサイズを表示.
echo "Original size: " . strlen($data) . " bytes\n";
echo "gzcompress size: " . strlen($compressed_data_compress) . " bytes\n";
echo "gzdeflate size: " . strlen($compressed_data_deflate) . " bytes\n";

// 圧縮データをデコードして比較.
$decompressed_data_compress = gzuncompress($compressed_data_compress);
$decompressed_data_deflate = gzinflate($compressed_data_deflate);

// 元のデータとデコードされたデータが一致するか確認.
if ($data === $decompressed_data_compress) {
    echo "gzcompress: Successfully compressed and decompressed.\n";
} else {
    echo "gzcompress: Compression or decompression failed.\n";
}

if ($data === $decompressed_data_deflate) {
    echo "gzdeflate: Successfully compressed and decompressed.\n";
} else {
    echo "gzdeflate: Compression or decompression failed.\n";
}

?>

PHP 8.4 の gzcompress 関数は、データを圧縮するために使用されます。この関数は、文字列型の $data を引数として受け取り、圧縮された文字列を返します。オプションで、圧縮レベル $level を指定できます。$level は 0 から 9 までの整数で、0 は圧縮なし、9 は最高の圧縮率を示します。デフォルト値は -1 で、zlib ライブラリのデフォルトの圧縮レベルが使用されます。また、$encoding 引数でエンコーディング方式を指定できますが、通常はデフォルト値の ZLIB_ENCODING_DEFLATE を使用します。

サンプルコードでは、gzcompressgzdeflate という似た機能を持つ関数との比較を行っています。どちらの関数もデータを圧縮しますが、圧縮フォーマットが異なります。gzcompress は zlib フォーマットを使用し、gzdeflate は deflate フォーマットを使用します。

コードでは、まず $data という文字列を定義し、それぞれの関数で圧縮しています。gzcompress($data, 9) は、最高レベルの圧縮を行い、圧縮されたデータを $compressed_data_compress に格納します。同様に、gzdeflate($data, 9) も最高レベルで圧縮し、結果を $compressed_data_deflate に格納します。

その後、元のデータサイズと圧縮後のデータサイズを比較し、圧縮効果を確認しています。圧縮されたデータは、それぞれ gzuncompress 関数および gzinflate 関数で元のデータに戻すことができます。最後に、圧縮・解凍後のデータが元のデータと一致するかどうかを検証し、結果を表示しています。gzcompress で圧縮したデータは gzuncompress で、gzdeflate で圧縮したデータは gzinflate で解凍する必要がある点に注意してください。

gzcompressgzdeflateはどちらもデータを圧縮しますが、互換性のある解凍関数が異なります。gzcompressで圧縮したデータはgzuncompressで、gzdeflateで圧縮したデータはgzinflateで解凍する必要があります。圧縮レベルは0から9で指定し、9が最も高い圧縮率ですが、処理時間も長くなります。圧縮に失敗した場合、gzcompressgzdeflatefalseを返すため、戻り値がfalseでないか確認することが重要です。gzcompressはzlibヘッダとトレーラを含むのに対し、gzdeflateは生のdeflateストリームを生成するため、使用する場面に応じて適切な関数を選択してください。セキュリティ上の理由から、外部からの入力データを直接圧縮・解凍する際には、データサイズの上限を設定することを推奨します。

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