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

gzinflate関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

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

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

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

構文(syntax)

1gzinflate(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展開する

1<?php
2
3/**
4 * Base64 でエンコードされた、gzip 圧縮されたデータを展開します。
5 *
6 * @param string $base64EncodedGzippedData Base64 エンコードされた gzip 圧縮データ
7 * @return string|false 展開されたデータ。失敗した場合は false
8 */
9function inflateBase64GzipData(string $base64EncodedGzippedData): string|false
10{
11    // Base64 デコード
12    $gzippedData = base64_decode($base64EncodedGzippedData);
13
14    if ($gzippedData === false) {
15        return false; // Base64 デコードに失敗
16    }
17
18    // gzinflate で展開
19    $inflatedData = gzinflate($gzippedData);
20
21    if ($inflatedData === false) {
22        return false; // gzinflate に失敗
23    }
24
25    return $inflatedData;
26}
27
28// 使用例
29$originalData = "This is a test string to be compressed and then inflated.";
30$gzippedData = gzdeflate($originalData);
31$base64EncodedGzippedData = base64_encode($gzippedData);
32
33$inflatedData = inflateBase64GzipData($base64EncodedGzippedData);
34
35if ($inflatedData !== false) {
36    // echo "Original Data: " . $originalData . "\n"; // オリジナルデータ
37    // echo "Inflated Data: " . $inflatedData . "\n"; // 展開されたデータ
38
39    if ($originalData === $inflatedData) {
40        // echo "Successfully inflated the data.\n"; // 成功
41    } else {
42        // echo "Failed to inflate the data.\n"; // 失敗
43    }
44} else {
45    // echo "Failed to inflate the data.\n"; // 失敗
46}

このサンプルコードは、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で圧縮データを解凍する

1<?php
2
3/**
4 * gzinflate 関数を使ったサンプルコード
5 *
6 * 圧縮されたデータを解凍します。
7 */
8
9$compressed_data = gzdeflate("This is a sample string to be compressed.");
10
11// 圧縮されたデータを解凍する
12$original_data = gzinflate($compressed_data);
13
14if ($original_data !== false) {
15    echo "解凍されたデータ: " . $original_data . PHP_EOL;
16} else {
17    echo "解凍に失敗しました。" . PHP_EOL;
18}
19
20
21// 最大長を指定して解凍する例
22$compressed_data_with_extra = gzdeflate("This is a longer sample string to be compressed.  This part exceeds the max_length.");
23$max_length = 50;
24$inflated_data_with_max_length = gzinflate($compressed_data_with_extra, $max_length);
25
26
27if ($inflated_data_with_max_length !== false) {
28    echo "最大長を指定して解凍されたデータ (" . $max_length . " バイト): " . substr($inflated_data_with_max_length, 0, $max_length) . PHP_EOL;
29} else {
30    echo "最大長を指定した解凍に失敗しました。" . PHP_EOL;
31}
32?>

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エンジニア