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

【PHP8.x】PharData::decompress()メソッドの使い方

decompressメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

decompressメソッドは、PharDataクラスに属し、圧縮されたPharDataアーカイブファイルを解凍するメソッドです。このメソッドは、Gzip (.gz) または Bzip2 (.bz2) 形式で圧縮されたPharDataアーカイブを元の非圧縮状態に戻すために使用されます。

具体的には、tar.gztar.bz2といった拡張子を持つPharDataアーカイブファイルを対象とし、その圧縮を解除して、中身のファイル群にアクセスできるようにします。解凍後のアーカイブファイルに異なる名前を付けたい場合は、引数として新しいファイル名を指定することが可能です。これにより、例えば archive.tar.gzarchive.tar として解凍したり、指定した名前で新しい非圧縮アーカイブを作成したりできます。

処理が成功した場合、このメソッドは解凍された新しいPharDataオブジェクトを返します。これにより、引き続き解凍後のアーカイブに対して操作を行うことができます。しかし、何らかの理由で解凍に失敗した場合は、falseが返されます。特に注意が必要な点として、元々圧縮されていないPharDataアーカイブに対してこのdecompressメソッドを呼び出すと、エラー(例外)が発生しますので、使用する際はアーカイブがGzipまたはBzip2形式で圧縮されていることを確認してください。圧縮されたアーカイブの内容を読み込みたい場合や、別の形式に変換する前処理としてこのメソッドが役立ちます。

構文(syntax)

1<?php
2
3$pharData = new PharData('path/to/archive.tar.gz');
4$decompressedPharData = $pharData->decompress();
5
6?>

引数(parameters)

?string $extension = null

  • string|null $extension = null: 展開するアーカイブの拡張子を指定します。指定しない場合は、元のファイル名から自動的に推測されます。

戻り値(return)

PharData|null

PharData::decompressメソッドは、圧縮されたPharアーカイブを解凍し、解凍されたアーカイブを表すPharDataオブジェクト、または解凍に失敗した場合はnullを返します。

サンプルコード

PharData::decompress で GZIP 解凍する

1<?php
2
3// Phar 拡張が有効になっているか確認
4if (!extension_loaded('phar')) {
5    echo "エラー: PHP Phar 拡張が有効になっていません。\n";
6    echo "php.ini で 'extension=phar.so' (Linux/macOS) または 'extension=php_phar.dll' (Windows) のコメントを外してください。\n";
7    // スクリプトの実行を停止
8    exit(1);
9}
10
11/**
12 * PharData::decompress メソッドのサンプルコード。
13 * GZIP圧縮されたTARアーカイブの作成、圧縮、解凍、および内容確認を行います。
14 *
15 * この関数は、システムエンジニアを目指す初心者の方にも分かりやすいように、
16 * 各ステップで何が行われているかをコメントと出力で示します。
17 *
18 * @return void
19 */
20function demonstratePharDataDecompressGzip(): void
21{
22    // 一時ディレクトリを準備
23    // ユニークな名前でディレクトリを作成し、他のプロセスとの衝突を避けます。
24    $tempDir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . uniqid('phardata_decompress_');
25    if (!mkdir($tempDir, 0777, true)) {
26        // ディレクトリ作成に失敗した場合、エラーメッセージを出力して終了
27        die("エラー: 一時ディレクトリの作成に失敗しました: $tempDir\n");
28    }
29    echo "一時ディレクトリを作成しました: $tempDir\n";
30
31    // アーカイブに含めるダミーファイルのパスと内容を定義し、作成
32    $file1Name = 'sample_file1.txt';
33    $file2Name = 'sample_file2.txt';
34    $file1Path = $tempDir . DIRECTORY_SEPARATOR . $file1Name;
35    $file2Path = $tempDir . DIRECTORY_SEPARATOR . $file2Name;
36    file_put_contents($file1Path, 'これは最初のサンプルファイルの内容です。');
37    file_put_contents($file2Path, 'これは2番目のサンプルファイルの内容です。');
38    echo "ダミーファイルを作成しました: $file1Path, $file2Path\n";
39
40    // 各アーカイブの状態に対応するファイルパスを定義
41    // 初期のTARアーカイブのパス
42    $initialTarArchivePath = $tempDir . DIRECTORY_SEPARATOR . 'my_archive.tar';
43    // GZIP圧縮されたTARアーカイブのパス (compressメソッドがこの名前で作成)
44    $gzippedTarArchivePath = $tempDir . DIRECTORY_SEPARATOR . 'my_archive.tar.gz';
45    // decompressメソッドによって解凍されるTARアーカイブのパス
46    // 通常、元の圧縮ファイルの拡張子を取り除いた名前になります。
47    // この例では、$initialTarArchivePath と同じパスになるため、既存のファイルは上書きされます。
48    $decompressedTarArchivePath = $tempDir . DIRECTORY_SEPARATOR . 'my_archive.tar';
49
50    try {
51        // --- ステップ1: TARアーカイブを作成する ---
52        echo "\n--- ステップ1: TARアーカイブの作成 ---\n";
53        // PharDataオブジェクトをインスタンス化すると、指定したパスに新しいアーカイブが作成されます。
54        $phar = new PharData($initialTarArchivePath);
55        // アーカイブにファイルを追加します。第2引数はアーカイブ内のパスです。
56        $phar->addFile($file1Path, 'data/' . $file1Name);
57        $phar->addFile($file2Path, 'data/' . $file2Name);
58        // オブジェクトを解放することで、アーカイブファイルへの変更が確実にディスクに書き込まれます。
59        $phar = null;
60
61        echo "TARアーカイブを作成しました: " . $initialTarArchivePath . "\n";
62        if (file_exists($initialTarArchivePath)) {
63            echo "  - ファイルサイズ: " . filesize($initialTarArchivePath) . "バイト\n";
64        }
65
66        // --- ステップ2: 作成したTARアーカイブをGZIP形式で圧縮する ---
67        echo "\n--- ステップ2: TARアーカイブのGZIP圧縮 ---\n";
68        // 圧縮したいアーカイブを再度PharDataオブジェクトとして開きます。
69        $pharToCompress = new PharData($initialTarArchivePath);
70        // compress() メソッドは、新しい圧縮されたアーカイブを作成し、
71        // その新しいアーカイブを指すPharDataオブジェクトを返します。
72        // Phar::GZ 定数はGZIP圧縮を指定します。
73        $gzippedPhar = $pharToCompress->compress(Phar::GZ);
74
75        if ($gzippedPhar instanceof PharData) {
76            echo "TARアーカイブをGZIP形式で圧縮しました: " . $gzippedPhar->getPath() . "\n";
77            if (file_exists($gzippedTarArchivePath)) {
78                echo "  - ファイルサイズ: " . filesize($gzippedTarArchivePath) . "バイト\n";
79            }
80        } else {
81            echo "エラー: アーカイブのGZIP圧縮に失敗しました。\n";
82            return; // 圧縮に失敗した場合は、これ以上処理を続行しません。
83        }
84
85        // --- ステップ3: GZIP圧縮されたアーカイブを解凍する (PharData::decompress) ---
86        echo "\n--- ステップ3: GZIP圧縮アーカイブの解凍 ---\n";
87        // decompress() メソッドを呼び出します。
88        // 引数 $extension は null なので、PHPは元の拡張子 (.tar.gz) から解凍後の拡張子 (.tar) を自動的に判断します。
89        // この処理により、$gzippedTarArchivePath が解凍され、$decompressedTarArchivePath ($initialTarArchivePath と同じパス)
90        // に新しい解凍済みアーカイブが作成されます。もし同名のファイルが既に存在する場合、それは上書きされます。
91        $decompressedPhar = $gzippedPhar->decompress();
92
93        if ($decompressedPhar instanceof PharData) {
94            echo "GZIP圧縮アーカイブを解凍しました: " . $decompressedPhar->getPath() . "\n";
95            if (file_exists($decompressedTarArchivePath)) {
96                echo "  - ファイルサイズ: " . filesize($decompressedTarArchivePath) . "バイト\n";
97            }
98
99            // 解凍されたアーカイブの内容を確認
100            echo "\n--- 解凍されたアーカイブの内容を確認 ---\n";
101            // RecursiveIteratorIterator を使用して、アーカイブ内のすべてのファイル(サブディレクトリも含む)をリスト表示します。
102            foreach (new RecursiveIteratorIterator($decompressedPhar) as $file) {
103                /** @var PharFileInfo $file */
104                echo "  - " . $file->getPathname() . " (サイズ: " . $file->getSize() . "バイト)\n";
105            }
106
107            // 特定のファイルの内容を直接読み取る例
108            // 配列のようにアクセスしてPharFileオブジェクトを取得し、その getContent() メソッドで内容を取得します。
109            if (isset($decompressedPhar['data/' . $file1Name])) {
110                echo "ファイル 'data/" . $file1Name . "' の内容:\n";
111                echo "  " . $decompressedPhar['data/' . $file1Name]->getContent() . "\n";
112            }
113
114        } else {
115            echo "エラー: アーカイブの解凍に失敗しました。\n";
116        }
117
118    } catch (Exception $e) {
119        // Phar 操作中に例外が発生した場合のハンドリング
120        echo "致命的なエラーが発生しました: " . $e->getMessage() . "\n";
121    } finally {
122        // --- ステップ4: 後処理 (作成した一時ファイルとディレクトリの削除) ---
123        echo "\n--- ステップ4: クリーンアップ ---\n";
124        // 作成したダミーファイルを削除
125        if (file_exists($file1Path)) { unlink($file1Path); echo "  - 削除: $file1Path\n"; }
126        if (file_exists($file2Path)) { unlink($file2Path); echo "  - 削除: $file2Path\n"; }
127
128        // 作成したアーカイブファイルを削除
129        // $initialTarArchivePath と $decompressedTarArchivePath は同じパスを指すため、
130        // どちらか一方を削除すれば十分です。
131        if (file_exists($initialTarArchivePath)) { unlink($initialTarArchivePath); echo "  - 削除: $initialTarArchivePath\n"; }
132        if (file_exists($gzippedTarArchivePath)) { unlink($gzippedTarArchivePath); echo "  - 削除: $gzippedTarArchivePath\n"; }
133
134        // 空になった一時ディレクトリを削除
135        if (file_exists($tempDir) && is_dir($tempDir)) {
136            rmdir($tempDir);
137            echo "  - 削除: $tempDir (一時ディレクトリ)\n";
138        }
139        echo "クリーンアップが完了しました。\n";
140    }
141}
142
143// サンプルコードの実行
144demonstratePharDataDecompressGzip();

「PharData::decompress」メソッドは、PHPで圧縮されたPharデータアーカイブを元の非圧縮形式に解凍するために使用します。このメソッドは、対象のPharDataオブジェクトが指す圧縮ファイルを読み込み、解凍された新しいPharデータアーカイブを生成します。

引数$extensionはオプションで、解凍後のファイルの拡張子を明示的に指定できますが、nullを指定するとPHPが自動的に適切な拡張子(例えば、.tar.gzから.tarへ)を判断します。メソッドが成功すると、解凍された新しいPharDataオブジェクトが返され、失敗した場合はnullが返されます。

このサンプルコードでは、まずダミーファイルを含むTARアーカイブを作成し、それをGZIP形式で圧縮します。次に、このGZIP圧縮されたアーカイブに対して「decompress」メソッドを呼び出し、元のTAR形式に解凍します。解凍後のアーカイブの内容が正しくアクセスできることを確認することで、一連の圧縮・解凍処理が正常に完了したことを示しています。本機能を利用するには、PHPのPhar拡張が有効になっている必要があります。

Phar拡張がPHPに有効になっているか、事前に確認してください。php.iniでの設定が必要です。decompress()メソッドは、元の圧縮ファイルから解凍後のファイルを生成しますが、同名のファイルが存在する場合は上書きされる点に注意が必要です。メソッドの戻り値は成功時にPharDataオブジェクト、失敗時にnullですので、必ず戻り値を確認し、エラー処理を組み込んでください。ファイル操作を伴うため、一時ファイルの適切な管理と、例外発生時を考慮したクリーンアップを忘れずに行うことが重要です。

PHP PharData::decompressでZIPを解凍する

1<?php
2
3/**
4 * このスクリプトは、PHPのPharData::decompressメソッドを使用して、
5 * GZ圧縮されたZIPアーカイブを元のZIP形式に解凍する具体的な例を示します。
6 *
7 * PharData::decompressは、主に.gzや.bz2などの圧縮形式で格納された
8 * Phar/Tar/Zipアーカイブを、圧縮されていない元の形式に戻すために使用されます。
9 * 一般的な「ZIPファイルを展開して中のファイルを取り出す」動作とは異なり、
10 * 「圧縮されたZIPファイル(例: my_archive.zip.gz)の圧縮形式を解除し、
11 * 元のZIPファイル(例: my_archive.zip)に戻す」のが主な機能です。
12 *
13 * 動作フロー:
14 * 1. 一時的なZIPアーカイブを作成し、内部にダミーファイルを追加します。
15 *    (例: my_archive_example.zip)
16 * 2. 作成したZIPアーカイブをGZ形式で圧縮します。
17 *    (例: my_archive_example.zip を my_archive_example.zip.gz に変換)
18 * 3. 圧縮されたZIPアーカイブをPharData::decompressメソッドで解凍します。
19 *    (例: my_archive_example.zip.gz を my_archive_example.zip に戻す)
20 * 4. 解凍されたアーカイブの内容を確認します。
21 * 5. スクリプト実行後、作成されたすべての一時ファイルをクリーンアップします。
22 */
23
24// --- 定義とヘルパー関数 ---
25
26// 一時ファイルの名前を定義します
27$baseName = 'my_archive_example';
28$zipFileName = $baseName . '.zip';          // 例: my_archive_example.zip
29$compressedZipFileName = $zipFileName . '.gz'; // 例: my_archive_example.zip.gz (GZ圧縮されたZIP)
30
31/**
32 * 指定されたファイルが存在する場合に削除するヘルパー関数です。
33 *
34 * @param string[] $files 削除するファイルパスの配列
35 */
36function cleanup(array $files): void
37{
38    foreach ($files as $file) {
39        if (file_exists($file)) {
40            unlink($file);
41            echo "   クリーンアップ: '{$file}' を削除しました。\n";
42        }
43    }
44}
45
46// --- メイン処理 ---
47
48// スクリプト実行前に、もし以前の実行で残った一時ファイルがあれば削除します
49echo "--- 事前クリーンアップ --- \n";
50cleanup([$zipFileName, $compressedZipFileName]);
51echo "\n";
52
53echo "--- PharData::decompress のサンプル実行 --- \n\n";
54
55try {
56    // 1. サンプル用のZIPアーカイブを作成します
57    echo "1. 新しいZIPアーカイブ ('{$zipFileName}') を作成し、ファイルを追加します。\n";
58    // 新しいZIPファイルをPharDataオブジェクトとして開きます
59    $pharData = new PharData($zipFileName);
60    // アーカイブにテストファイルを追加します
61    $pharData->addFromString('file1.txt', 'これは最初のテストファイルです。');
62    $pharData->addFromString('subdir/file2.txt', 'これはサブディレクトリ内の2番目のテストファイルです。');
63    // オブジェクトを解放することで、ファイルへの変更を確実に保存します
64    unset($pharData);
65    
66    if (!file_exists($zipFileName)) {
67        throw new Exception("ZIPアーカイブ '{$zipFileName}' の作成に失敗しました。");
68    }
69    echo "   '{$zipFileName}' が正常に作成されました。\n\n";
70
71    // 2. 作成したZIPアーカイブをGZ形式で圧縮します
72    //    これにより、'my_archive_example.zip' が 'my_archive_example.zip.gz' になります。
73    //    元の 'my_archive_example.zip' は compress() メソッドの実行により自動的に削除されます。
74    echo "2. '{$zipFileName}' を GZ 形式で圧縮し、'{$compressedZipFileName}' を作成します。\n";
75    // 既存のZIPファイルからPharDataオブジェクトを作成します
76    $pharDataToCompress = new PharData($zipFileName);
77    // GZ圧縮を実行します (Phar::GZ はGzip圧縮を指定)
78    $compressedPharData = $pharDataToCompress->compress(Phar::GZ);
79
80    if (!file_exists($compressedZipFileName)) {
81        throw new Exception("GZ圧縮されたZIPアーカイブ '{$compressedZipFileName}' の作成に失敗しました。");
82    }
83    echo "   '{$compressedZipFileName}' が正常に作成されました。\n";
84    // compress() が成功すると、元のファイルは削除されるため、存在しないことを確認します
85    if (file_exists($zipFileName)) {
86        echo "   警告: 元の '{$zipFileName}' が残っています。手動で削除します。\n";
87        unlink($zipFileName);
88    } else {
89        echo "   元の '{$zipFileName}' は削除されました。\n";
90    }
91    echo "\n";
92
93    // 3. GZ圧縮されたZIPアーカイブを解凍します (PharData::decompress)
94    //    これにより、'my_archive_example.zip.gz' が 'my_archive_example.zip' に戻ります。
95    //    元の 'my_archive_example.zip.gz' は decompress() メソッドの実行により自動的に削除されます。
96    echo "3. '{$compressedZipFileName}' を PharData::decompress を使用して解凍します。\n";
97    // 圧縮されたファイルからPharDataオブジェクトを作成します
98    $pharDataToDecompress = new PharData($compressedZipFileName);
99    // decompress メソッドを実行します
100    $decompressedPharData = $pharDataToDecompress->decompress();
101
102    if ($decompressedPharData === null) {
103        throw new Exception("PharData::decompress が失敗しました。戻り値が null です。");
104    }
105
106    if (!file_exists($zipFileName)) {
107        throw new Exception("解凍に失敗しました: '{$zipFileName}' が作成されませんでした。");
108    }
109    echo "   '{$compressedZipFileName}' は '{$zipFileName}' に正常に解凍されました。\n";
110    echo "   解凍されたアーカイブのファイルパス: " . $decompressedPharData->getPath() . "\n\n";
111    
112    // 4. 解凍されたZIPアーカイブの内容を確認します (オプション)
113    echo "4. 解凍されたZIPアーカイブ ('{$zipFileName}') の内容を確認します:\n";
114    // PharDataオブジェクトはイテレーターとして動作し、アーカイブ内のファイルを列挙できます
115    foreach ($decompressedPharData as $file) {
116        echo "   - " . $file->getPathname() . "\n";
117    }
118    echo "\n";
119
120} catch (Exception $e) {
121    echo "!!! エラーが発生しました: " . $e->getMessage() . " !!!\n\n";
122} finally {
123    // 最終的なクリーンアップ: 作成された一時ファイルをすべて削除します
124    echo "--- 最終クリーンアップ --- \n";
125    cleanup([$zipFileName, $compressedZipFileName]);
126}
127
128?>

PHPのPharData::decompressメソッドは、GZやBZ2などの圧縮形式で格納されたPhar、Tar、Zipといったアーカイブの圧縮を解除し、元のファイル形式に戻すために使用されます。このメソッドは、一般的な「ZIPファイルから中のファイルを取り出す」という展開動作とは異なり、「my_archive.zip.gzのような圧縮されたZIPファイルから、my_archive.zipという元のZIP形式への圧縮形式を解除する」のが主な役割です。

引数$extensionは、解凍後のファイルに適用する拡張子を任意で指定できますが、省略された場合はPHPがファイルの内容から適切な拡張子を自動で判断します。メソッドが成功すると、解凍された新しいPharDataオブジェクトが返され、元の圧縮ファイルは自動的に削除されます。失敗した場合はnullが戻り値となります。

このサンプルコードでは、まず一時的なZIPアーカイブを作成し、次にそれをGZ形式で圧縮します。最後に、PharData::decompressメソッドを使ってGZ圧縮されたZIPファイルを元のZIP形式に解凍し、その内容を確認する一連の流れを示しています。これにより、圧縮されたZIPアーカイブを元の状態に戻す具体的な手順を理解できます。

PharData::decompressは、一般的なZIPファイルの内容を解凍して取り出す機能とは異なり、GZやBZ2などで圧縮されたZIPアーカイブ(例: my_archive.zip.gz)自体の圧縮形式を解除し、元のZIPファイル(例: my_archive.zip)に戻すメソッドです。この処理が成功した場合、元の圧縮ファイルは自動的に削除されます。ファイルシステムの書き込み権限が必要となるため、スクリプトを実行する環境の権限設定に注意してください。また、ファイル操作には予期せぬエラーが伴うことがあるため、try-catch構文で例外処理を行い、作成された一時ファイルはfinallyブロックなどで必ずクリーンアップすることが安全なコード利用の基本となります。

関連コンテンツ