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

作成日: 更新日:

gzinflate関数は、圧縮された文字列を展開する関数です。具体的には、zlib形式で圧縮されたデータを展開し、元の文字列を返します。この関数は、gzip形式の圧縮データ(gzipヘッダとトレーラを含む)ではなく、zlib形式の圧縮データ(生のdeflateストリーム)を処理するために設計されています。

gzinflate関数は、通常、gzdeflate関数で圧縮されたデータを元に戻すために使用されます。Webアプリケーションやデータ処理において、通信帯域を節約したり、ストレージ容量を削減したりするためにデータを圧縮し、必要に応じて展開する際に役立ちます。例えば、データベースに保存された圧縮データを読み込んで展開したり、APIから受信した圧縮データを処理したりする際に利用できます。

関数の引数には、圧縮された文字列と、オプションで展開に関するパラメータを指定できます。パラメータを指定することで、展開処理の挙動を細かく制御することが可能です。展開に成功した場合は元の文字列が返され、エラーが発生した場合はfalseが返されます。戻り値の型はstringまたはfalseです。この関数を使用する際には、圧縮されたデータがzlib形式であることを確認してください。gzip形式のデータを展開する場合は、gzdecode関数を使用する必要があります。

基本的な使い方

構文(syntax)

gzinflate(string $data, int $length = 0, int $encoding = ZLIB_ENCODING_RAW): string|false

引数(parameters)

string $data, int $max_length = 0

  • string $data: 圧縮されたデータを格納する文字列
  • int $max_length = 0: 解凍後のデータの最大長を指定する整数。0を指定すると、解凍されたデータの長さに制限はありません

戻り値(return)

string|false

PHP 8.4 の gzinflate 関数は、zlib 圧縮されたデータを解凍した文字列を返します。解凍に失敗した場合は false を返します。

サンプルコード

PHPでBase64 gzip展開する

<?php

/**
 * Base64 でエンコードされた、gzip 圧縮されたデータを展開します。
 *
 * @param string $base64EncodedGzippedData Base64 エンコードされた gzip 圧縮データ
 * @return string|false 展開されたデータ。失敗した場合は false
 */
function inflateBase64GzipData(string $base64EncodedGzippedData): string|false
{
    // Base64 デコード
    $gzippedData = base64_decode($base64EncodedGzippedData);

    if ($gzippedData === false) {
        return false; // Base64 デコードに失敗
    }

    // gzinflate で展開
    $inflatedData = gzinflate($gzippedData);

    if ($inflatedData === false) {
        return false; // gzinflate に失敗
    }

    return $inflatedData;
}

// 使用例
$originalData = "This is a test string to be compressed and then inflated.";
$gzippedData = gzdeflate($originalData);
$base64EncodedGzippedData = base64_encode($gzippedData);

$inflatedData = inflateBase64GzipData($base64EncodedGzippedData);

if ($inflatedData !== false) {
    // echo "Original Data: " . $originalData . "\n"; // オリジナルデータ
    // echo "Inflated Data: " . $inflatedData . "\n"; // 展開されたデータ

    if ($originalData === $inflatedData) {
        // echo "Successfully inflated the data.\n"; // 成功
    } else {
        // echo "Failed to inflate the data.\n"; // 失敗
    }
} else {
    // echo "Failed to inflate the data.\n"; // 失敗
}

このサンプルコードは、Base64エンコードされたgzip圧縮データを展開するinflateBase64GzipData関数を定義しています。gzinflate関数とbase64_decode関数を組み合わせて使用することで、圧縮されたデータを元の状態に戻します。

まず、関数は引数としてBase64エンコードされたgzip圧縮された文字列 $base64EncodedGzippedData を受け取ります。この文字列は、base64_decode関数によってデコードされ、gzip圧縮されたデータ $gzippedData に変換されます。もしデコードに失敗した場合、関数は false を返します。

次に、gzinflate関数が $gzippedData を展開します。gzinflate関数は、圧縮されたデータを展開し、元の文字列を返します。もし展開に失敗した場合、gzinflate関数は false を返します。inflateBase64GzipData関数も同様に false を返します。

最後に、展開されたデータ $inflatedData が返されます。サンプルコードでは、gzdeflate関数で圧縮し、base64_encode関数でエンコードしたデータを用いて、展開処理のテストを行っています。展開されたデータと元のデータを比較することで、処理が正常に行われたかを確認できます。

gzinflate関数の引数 $data には、gzip圧縮された文字列を指定します。オプションの引数 $max_length は、展開するデータの最大長を指定します。省略した場合、最大長は制限されません。gzinflate関数は、展開された文字列を返すか、エラーが発生した場合は false を返します。

gzinflate関数を使う際の注意点です。まず、gzinflateは圧縮されたデータを展開する関数ですが、引数として渡すデータが正しいgzip形式である必要があります。サンプルコードでは、base64_decodeでデコードされたデータがgzip形式であることを前提としています。デコードに失敗するとfalseが返るので、エラーハンドリングが重要です。また、gzinflate自体も展開に失敗するとfalseを返します。$max_length引数は展開後の最大サイズを指定できますが、省略するとデフォルト値が使用されます。しかし、信頼できないデータに対しては、DoS攻撃を防ぐために適切な最大サイズを指定することを推奨します。セキュリティ上の注意として、外部からのデータを受け取る場合は、展開後のデータが大きくなりすぎないように、サイズ制限を設けることが重要です。

PHP gzinflateで圧縮データを解凍する

<?php

/**
 * gzinflate 関数を使ったサンプルコード
 *
 * 圧縮されたデータを解凍します。
 */

$compressed_data = gzdeflate("This is a sample string to be compressed.");

// 圧縮されたデータを解凍する
$original_data = gzinflate($compressed_data);

if ($original_data !== false) {
    echo "解凍されたデータ: " . $original_data . PHP_EOL;
} else {
    echo "解凍に失敗しました。" . PHP_EOL;
}


// 最大長を指定して解凍する例
$compressed_data_with_extra = gzdeflate("This is a longer sample string to be compressed.  This part exceeds the max_length.");
$max_length = 50;
$inflated_data_with_max_length = gzinflate($compressed_data_with_extra, $max_length);


if ($inflated_data_with_max_length !== false) {
    echo "最大長を指定して解凍されたデータ (" . $max_length . " バイト): " . substr($inflated_data_with_max_length, 0, $max_length) . PHP_EOL;
} else {
    echo "最大長を指定した解凍に失敗しました。" . PHP_EOL;
}
?>

PHPのgzinflate関数は、圧縮された文字列データを解凍するために使用します。この関数は、zlibライブラリを利用してデータを解凍します。

第1引数$dataには、解凍したい圧縮された文字列を指定します。第2引数$max_lengthはオプションで、解凍するデータの最大長をバイト単位で指定できます。$max_lengthを省略した場合、または0を指定した場合、データ全体が解凍されます。

関数は、解凍された文字列を返します。もし解凍に失敗した場合(例えば、データが有効な圧縮形式でない場合や、$max_lengthを超えた場合)、falseを返します。

サンプルコードでは、まずgzdeflate関数を使って文字列を圧縮しています。次に、gzinflate関数を使って圧縮されたデータを解凍し、元の文字列に戻します。解凍が成功した場合は、解凍されたデータを出力します。また、$max_lengthを指定して解凍する例も示しており、この場合、指定された最大長までのデータが解凍されます。解凍結果がfalseでないか確認することで、解凍が正常に行われたかどうかを判断できます。システムエンジニアを目指す方は、この関数を利用して、圧縮されたデータを効率的に扱うことができます。

gzinflate関数は、圧縮されたデータを解凍する際に使用します。引数 $data には圧縮された文字列を、$max_length には解凍する最大バイト数を指定します。$max_length を省略すると、可能な限り解凍されます。

戻り値は、解凍された文字列または失敗した場合 false です。解凍に失敗する可能性があるため、戻り値が false でないか確認することが重要です。

$max_length を指定した場合、解凍後のデータが指定された長さを超える場合でも、指定された長さまでしか解凍されません。これにより、メモリ使用量を制限できます。substr関数は文字化け対策として、指定されたバイト数で文字列を切り取る場合に利用します。

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