Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

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

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)

1gzcompress(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 で文字列を圧縮する

1<?php
2
3/**
4 * gzcompress 関数の基本的な使用例
5 * 文字列データをZLIB形式(RFC 1950 + RFC 1951)で圧縮する方法を示します。
6 * 圧縮レベルを変更することも可能で、デフォルトは-1(ZLIBのデフォルト)です。
7 */
8function demonstrateGzcompressBasicUsage(): void
9{
10    // 圧縮したい元の文字列データを用意します。
11    // 圧縮効果を確認しやすくするため、少し長めの繰り返しテキストを使用します。
12    $originalData = "PHPはWeb開発に広く使われているプログラミング言語です。PHP 8はパフォーマンスが向上し、新しい機能が追加されています。"
13                  . str_repeat(" gzcompress関数は、ファイルやネットワーク転送でデータのサイズを削減するのに役立ちます。", 5);
14
15    echo "元のデータサイズ: " . strlen($originalData) . " バイト\n";
16    echo "元のデータ (冒頭): " . substr($originalData, 0, 80) . "...\n\n";
17
18    // gzcompress関数を使ってデータを圧縮します。
19    // 第2引数で圧縮レベルを指定できます(-1: デフォルト, 0: 圧縮なし, 1-9: 圧縮レベル、9が最大)。
20    // 第3引数でエンコーディング方式を指定できますが、通常はデフォルト(ZLIB_ENCODING_DEFLATE)で十分です。
21    $compressedData = gzcompress($originalData, 9); // 最大圧縮レベルで圧縮
22
23    // 圧縮が成功したかを確認します。失敗した場合はfalseが返されます。
24    if ($compressedData === false) {
25        echo "エラー: データの圧縮に失敗しました。\n";
26        return;
27    }
28
29    echo "圧縮後のデータサイズ: " . strlen($compressedData) . " バイト\n";
30    // 圧縮率を計算し表示します。
31    $compressionRatio = (strlen($compressedData) / strlen($originalData)) * 100;
32    echo "圧縮率: " . round($compressionRatio, 2) . "%\n\n";
33
34    // 圧縮されたデータはバイナリ形式なので、そのまま表示しても読めません。
35    // 通常はファイルに保存するか、ネットワークで送信します。
36    // 必要であれば、gzuncompress関数を使って元のデータに戻すことができます。
37    // $uncompressedData = gzuncompress($compressedData);
38    // if ($uncompressedData !== false && $uncompressedData === $originalData) {
39    //     echo "補足: 圧縮されたデータは正常に展開され、元のデータと一致しました。\n";
40    // }
41}
42
43// 上記の関数を実行して、gzcompressの動作を確認します。
44demonstrateGzcompressBasicUsage();
45
46?>

PHPのgzcompress関数は、指定された文字列データをZLIB形式(RFC 1950 + RFC 1951)で圧縮するために使用されます。主にファイルサイズやネットワーク転送量を削減したい場合に役立ちます。

この関数は、最初の引数$dataに圧縮したい元の文字列を、第2引数$levelに圧縮レベルを指定します。圧縮レベルは-1(デフォルト)から9までの整数で、9が最も高い圧縮率を示しますが、その分処理に時間がかかります。通常はデフォルトのZLIB_ENCODING_DEFLATEが使用されるため、第3引数$encodingは省略されることが多いです。

処理が成功すると圧縮されたバイナリ文字列が返され、失敗した場合はfalseが返されます。サンプルコードでは、まず長めの文字列を用意し、その元のデータサイズを表示しています。次にgzcompress関数を最大圧縮レベル(9)で実行し、圧縮が成功したかを確認します。圧縮後のデータサイズと元のデータサイズを比較することで、どれだけデータが削減されたか(圧縮率)を具体的に確認できます。圧縮されたデータはバイナリ形式のため、そのままでは読めませんが、必要に応じてgzuncompress関数を使うことで元のデータに復元可能です。

gzcompress関数は、文字列データをZLIB形式で圧縮する機能を提供します。圧縮処理は失敗する可能性があるため、関数の戻り値がfalseでないか必ず確認し、エラーハンドリングを実装することが重要です。圧縮されたデータはバイナリ形式であり、そのまま表示しても人間には読めません。このデータは主に、ファイル保存やネットワーク転送時のデータサイズ削減を目的として利用されます。元のデータに戻す際は、gzuncompress関数を使用します。第2引数で指定する圧縮レベルは、9が最も高い圧縮率を示しますが、その分処理時間が増加する傾向があります。データ量やシステム要件に応じて最適なレベルを選択するようにしましょう。

PHPでgzcompress/gzuncompressを使う

1<?php
2
3/**
4 * 文字列を圧縮し、圧縮された文字列を返します。
5 *
6 * @param string $data 圧縮する文字列
7 * @return string|false 圧縮された文字列。失敗した場合は false。
8 */
9function compress_data(string $data): string|false
10{
11    // 圧縮レベルを指定 (省略した場合はデフォルトの圧縮レベルが使用されます)
12    $compressed_data = gzcompress($data);
13
14    if ($compressed_data === false) {
15        return false; // 圧縮に失敗した場合
16    }
17
18    return $compressed_data;
19}
20
21/**
22 * 圧縮された文字列を解凍し、元の文字列を返します。
23 *
24 * @param string $compressed_data 解凍する文字列
25 * @return string|false 解凍された文字列。失敗した場合は false。
26 */
27function uncompress_data(string $compressed_data): string|false
28{
29    // 圧縮されたデータを解凍
30    $uncompressed_data = gzuncompress($compressed_data);
31
32    if ($uncompressed_data === false) {
33        return false; // 解凍に失敗した場合
34    }
35
36    return $uncompressed_data;
37}
38
39// 使用例
40$original_string = "This is a string to be compressed and uncompressed.";
41
42// 圧縮
43$compressed_string = compress_data($original_string);
44
45if ($compressed_string !== false) {
46    echo "圧縮後の文字列: " . base64_encode($compressed_string) . "\n"; // バイナリデータを表示するためにbase64エンコード
47
48    // 解凍
49    $uncompressed_string = uncompress_data($compressed_string);
50
51    if ($uncompressed_string !== false) {
52        echo "解凍後の文字列: " . $uncompressed_string . "\n";
53    } else {
54        echo "解凍に失敗しました。\n";
55    }
56} else {
57    echo "圧縮に失敗しました。\n";
58}
59
60?>

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を比較する

1<?php
2
3/**
4 * gzcompress, gzdeflate の比較サンプル.
5 */
6
7$data = "This is a test string to be compressed.";
8
9// gzcompress を使用してデータを圧縮.
10$compressed_data_compress = gzcompress($data, 9); // level 9 は最高の圧縮率.
11
12// gzdeflate を使用してデータを圧縮.
13$compressed_data_deflate = gzdeflate($data, 9); // level 9 は最高の圧縮率.
14
15// 圧縮されたデータのサイズを表示.
16echo "Original size: " . strlen($data) . " bytes\n";
17echo "gzcompress size: " . strlen($compressed_data_compress) . " bytes\n";
18echo "gzdeflate size: " . strlen($compressed_data_deflate) . " bytes\n";
19
20// 圧縮データをデコードして比較.
21$decompressed_data_compress = gzuncompress($compressed_data_compress);
22$decompressed_data_deflate = gzinflate($compressed_data_deflate);
23
24// 元のデータとデコードされたデータが一致するか確認.
25if ($data === $decompressed_data_compress) {
26    echo "gzcompress: Successfully compressed and decompressed.\n";
27} else {
28    echo "gzcompress: Compression or decompression failed.\n";
29}
30
31if ($data === $decompressed_data_deflate) {
32    echo "gzdeflate: Successfully compressed and decompressed.\n";
33} else {
34    echo "gzdeflate: Compression or decompression failed.\n";
35}
36
37?>

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ストリームを生成するため、使用する場面に応じて適切な関数を選択してください。セキュリティ上の理由から、外部からの入力データを直接圧縮・解凍する際には、データサイズの上限を設定することを推奨します。

PHP gzcompress vs gzencode 比較と使い分け

1<?php
2
3/**
4 * このスクリプトは、PHPのgzcompress関数とgzencode関数の違いを比較し、
5 * システムエンジニアを目指す初心者がそれぞれの圧縮メカニズムと適切な利用シーンを理解できるようにします。
6 *
7 * gzcompressはDEFLATEアルゴリズムでデータを圧縮しますが、GZIPヘッダーやフッターは含みません。
8 * gzencodeはGZIP形式でデータを圧縮し、GZIPヘッダーとフッターを含みます。
9 * そのため、gzencodeの出力はgzcompressよりもわずかに大きくなる傾向があります。
10 * それぞれの圧縮データは、対応する解凍関数 (gzuncompress, gzdecode) で元に戻す必要があります。
11 */
12
13// 圧縮する元のデータ
14$originalData = "Hello, System Engineers! This is a sample string to demonstrate the difference between PHP's gzcompress and gzencode functions. Understanding their distinct outputs is crucial for handling various data compression scenarios effectively.";
15
16echo "元のデータ長: " . strlen($originalData) . " バイト\n";
17echo "元のデータ: " . $originalData . "\n\n";
18
19// --- gzcompress の使用例 ---
20// gzcompressは、生のDEFLATE形式でデータを圧縮します。
21// これは、GZIPヘッダーやフッターを含まないため、ファイルサイズはgzencodeよりも小さくなることがあります。
22// 解凍にはgzuncompressを使用します。
23$compressedByGzcompress = gzcompress($originalData);
24
25if ($compressedByGzcompress === false) {
26    echo "エラー: gzcompress に失敗しました。\n";
27} else {
28    echo "--- gzcompress の出力 ---\n";
29    echo "gzcompressによる圧縮データ長: " . strlen($compressedByGzcompress) . " バイト\n";
30
31    // gzcompressで圧縮されたデータを解凍
32    $uncompressedByGzcompress = gzuncompress($compressedByGzcompress);
33
34    if ($uncompressedByGzcompress === false) {
35        echo "エラー: gzuncompress に失敗しました。\n";
36    } else {
37        echo "gzuncompressによる解凍データ長: " . strlen($uncompressedByGzcompress) . " バイト\n";
38        echo "元のデータと一致しますか (gzuncompress): " . ($uncompressedByGzcompress === $originalData ? "はい" : "いいえ") . "\n\n";
39    }
40}
41
42// --- gzencode の使用例 ---
43// gzencodeは、GZIP形式でデータを圧縮します。
44// GZIP形式にはヘッダーとフッターが含まれており、HTTPのContent-Encoding: gzipなど、
45// 標準的なGZIPファイルやストリームとして利用するのに適しています。
46// 解凍にはgzdecodeを使用します。
47$compressedByGzencode = gzencode($originalData);
48
49if ($compressedByGzencode === false) {
50    echo "エラー: gzencode に失敗しました。\n";
51} else {
52    echo "--- gzencode の出力 ---\n";
53    echo "gzencodeによる圧縮データ長: " . strlen($compressedByGzencode) . " バイト\n";
54
55    // gzencodeで圧縮されたデータを解凍
56    $uncompressedByGzencode = gzdecode($compressedByGzencode);
57
58    if ($uncompressedByGzencode === false) {
59        echo "エラー: gzdecode に失敗しました。\n";
60    } else {
61        echo "gzdecodeによる解凍データ長: " . strlen($uncompressedByGzencode) . " バイト\n";
62        echo "元のデータと一致しますか (gzdecode): " . ($uncompressedByGzencode === $originalData ? "はい" : "いいえ") . "\n\n";
63    }
64}
65
66echo "--- 重要な違い ---\n";
67echo "gzcompressは『生のDEFLATEデータ』を出力するのに対し、gzencodeは『GZIPフォーマットデータ(ヘッダーとフッターを含む)』を出力します。\n";
68echo "このため、通常は同じ入力データでもgzencodeの出力はgzcompressよりもわずかに大きくなります。\n";
69echo "それぞれのデータ形式に対応する解凍関数(DEFLATEにはgzuncompress、GZIPにはgzdecode)を使用する必要があります。\n";
70

PHPのgzcompress関数は、指定された文字列データをDEFLATEアルゴリズムを使用して圧縮します。最初の引数$dataには圧縮したい文字列を渡し、オプションの引数$levelで圧縮レベル(-1はデフォルト、0は無圧縮、9は最大圧縮)を指定できます。この関数は成功すると圧縮された文字列を返し、失敗した場合はfalseを返します。

gzcompressは、GZIPヘッダーやフッターを含まない「生のDEFLATE形式」でデータを生成します。そのため、圧縮後のデータは軽量ですが、GZIP対応のツールで直接解凍できない場合があります。この形式で圧縮されたデータは、PHPのgzuncompress関数を使用して元のデータに戻すことができます。

一方、gzencode関数はデータをGZIP形式で圧縮します。GZIP形式には標準的なヘッダーとフッターが含まれるため、gzencodeの出力はgzcompressよりもわずかにサイズが大きくなる傾向があります。GZIP形式はHTTP通信のContent-Encoding: gzipなどで広く利用されており、対応する解凍関数はgzdecodeです。

このように、gzcompressgzencodeは異なる形式で圧縮を行うため、データの利用目的に応じて適切な関数を選ぶことが重要です。

gzcompressgzencodeは、それぞれ異なる圧縮形式を使用します。gzcompressは生のDEFLATE形式で、gzencodeはGZIP形式で圧縮するため、混同すると正しく解凍できません。それぞれgzuncompressgzdecodeという対応する解凍関数を使う必要があります。

両関数とも圧縮に失敗した場合はfalseを返しますので、必ず戻り値をチェックし、エラー処理を記述することが重要です。HTTPのContent-Encoding: gzipのように標準的なGZIPフォーマットが必要な場合はgzencodeを利用するのが適切です。通常、GZIP形式はヘッダーなどを含むため、gzencodeの出力はgzcompressよりもわずかに大きくなります。

関連コンテンツ