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

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

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

作成日: 更新日:

基本的な使い方

compressメソッドは、PharDataオブジェクトが表すアーカイブ全体を圧縮するメソッドです。このメソッドは、指定された圧縮形式を用いて、PharDataアーカイブ内のすべてのファイルを圧縮し、アーカイブ全体のファイルサイズを削減する目的で使用されます。主に、データアーカイブの保存容量を節約したり、ネットワーク経由での転送効率を高めたりしたい場合に役立ちます。

利用可能な圧縮形式には、gzip形式を表すPhar::GZと、bzip2形式を表すPhar::BZ2があります。また、Phar::NONEを指定することで、既に圧縮されているアーカイブの圧縮を解除し、元の非圧縮状態に戻すことも可能です。このメソッドは、第一引数としてこれらの圧縮形式の定数を指定します。オプションの第二引数では、圧縮後のアーカイブに適用する新しいファイル拡張子を指定できます。この引数を省略した場合、PHPは指定された圧縮形式に応じたデフォルトの拡張子(例:gzipなら.gz、bzip2なら.bz2)を自動的に付与します。

compressメソッドは、圧縮処理が成功した場合にブール値のtrueを、何らかの理由で失敗した場合にはfalseを返します。この機能は、特に大規模なデータセットや多くのファイルを一つのアーカイブとして管理するシステムにおいて、効率的なデータ運用を実現するために非常に重要です。PharDataは、Webアプリケーションなどで使用するデータをまとめて配布したり、バックアップしたりする際に、そのデータ量を最適化する強力な手段となります。

構文(syntax)

1<?php
2$pharData = new PharData('path/to/myarchive.tar');
3$result = $pharData->compress(Phar::GZ);
4?>

引数(parameters)

int $compression, ?string $extension = null

  • int $compression: 圧縮方法を指定する整数。Phar::GZ または Phar::BZ2 を使用します。
  • ?string $extension = null: 圧縮後のファイル拡張子を指定する文字列。指定しない場合は、圧縮方法に応じたデフォルトの拡張子(.gz または .bz2)が使用されます。

戻り値(return)

PharData

このメソッドは、新しい PharData オブジェクトを返します。このオブジェクトは、圧縮されたファイルシステムを表し、元の PharData オブジェクトと同じ内容を含んでいます。

サンプルコード

PHP PharData::compressで画像アーカイブを圧縮する

1<?php
2
3/**
4 * PharData::compress メソッドを使用して、画像ファイルを含むディレクトリを
5 * 圧縮された .tar.gz アーカイブとして作成するサンプルです。
6 *
7 * このコードを実行するには、php.ini の `phar.readonly` 設定を `Off` にするか、
8 * コマンドラインで `php -d phar.readonly=0 your_script.php` のように実行する必要があります。
9 */
10function createAndCompressImagesArchive(): void
11{
12    // 一時ファイルのパスとアーカイブ名を定義
13    $tempDir = __DIR__ . '/temp_images_for_phar';
14    $archiveBaseName = 'images_collection';
15    $uncompressedTarPath = __DIR__ . '/' . $archiveBaseName . '.tar';
16    $compressedTarGzPath = __DIR__ . '/' . $archiveBaseName . '.tar.gz';
17
18    echo "--- アーカイブ作成と圧縮の処理を開始します ---\n";
19
20    // 1. ダミーの画像ファイルを含む一時ディレクトリを作成します。
21    // PharData はファイルの内容ではなく、ファイルをアーカイブするため、ダミーの内容で十分です。
22    echo "1. ダミー画像ファイルと一時ディレクトリ '{$tempDir}' を作成中...\n";
23    if (!is_dir($tempDir) && !mkdir($tempDir, 0777, true)) {
24        die("エラー: 一時ディレクトリ '{$tempDir}' の作成に失敗しました。\n");
25    }
26    file_put_contents($tempDir . '/photo1.jpg', 'このファイルはダミーのJPEG画像コンテンツです。');
27    file_put_contents($tempDir . '/logo.png', 'このファイルはダミーのPNG画像コンテンツです。');
28    file_put_contents($tempDir . '/icon.gif', 'このファイルはダミーのGIF画像コンテンツです。');
29    echo "   ダミー画像ファイルが '{$tempDir}' に作成されました。\n";
30
31    try {
32        // 2. 一時ディレクトリの内容から非圧縮の .tar アーカイブを作成します。
33        echo "2. 非圧縮の .tar アーカイブ '{$uncompressedTarPath}' を作成中...\n";
34        // PharData クラスは、Phar フォーマットでデータアーカイブ (.tar, .zip) を扱います。
35        // 引数にファイルパスを渡して新しいアーカイブを作成します。
36        $phar = new PharData($uncompressedTarPath);
37        // buildFromDirectory メソッドで、指定したディレクトリの内容をアーカイブに追加します。
38        $phar->buildFromDirectory($tempDir);
39        echo "   アーカイブ '{$uncompressedTarPath}' が正常に作成されました。\n";
40
41        // 3. 作成した .tar アーカイブを PharData::compress メソッドで .tar.gz 形式に圧縮します。
42        echo "3. '{$uncompressedTarPath}' を GZIP 圧縮して '{$compressedTarGzPath}' に変換中...\n";
43        // compress メソッドは、現在のアーカイブを新しい圧縮形式に変換します。
44        // Phar::GZ は GZIP 圧縮を指定する定数です。
45        // 成功した場合、新しい PharData オブジェクト(圧縮されたアーカイブ)を返します。
46        // 重要: compress() が成功すると、元の非圧縮アーカイブファイルは自動的に削除されます。
47        $compressedPhar = $phar->compress(Phar::GZ);
48
49        if ($compressedPhar instanceof PharData) {
50            echo "   アーカイブは正常に '{$compressedTarGzPath}' へ圧縮されました。\n";
51            echo "   元の非圧縮アーカイブ '{$uncompressedTarPath}' はPHPによって自動的に削除されました。\n";
52            echo "   カレントディレクトリに '{$archiveBaseName}.tar.gz' が作成されていることを確認してください。\n";
53        } else {
54            echo "   アーカイブの圧縮に失敗しました。\n";
55        }
56
57    } catch (PharException $e) {
58        // Phar 操作中に発生したエラーをキャッチし、初心者にも分かりやすいヒントを表示します。
59        echo "エラーが発生しました: " . $e->getMessage() . "\n";
60        echo "ヒント: Phar アーカイブの作成や変更には、php.ini で `phar.readonly=Off` を設定するか、\n";
61        echo "       コマンドラインで `php -d phar.readonly=0 ...` のように実行する必要があります。\n";
62    } finally {
63        // 4. クリーンアップ: 作成した一時ファイルとディレクトリを削除します。
64        echo "4. 一時ファイルとディレクトリのクリーンアップ中...\n";
65        // compress() メソッドが成功していれば、$uncompressedTarPath は既に削除されています。
66        // 念のため存在チェックを行います。
67        if (is_file($uncompressedTarPath)) {
68            unlink($uncompressedTarPath);
69        }
70        if (is_dir($tempDir)) {
71            $files = array_diff(scandir($tempDir), ['.', '..']);
72            foreach ($files as $file) {
73                unlink($tempDir . '/' . $file);
74            }
75            rmdir($tempDir);
76        }
77        echo "   クリーンアップが完了しました。\n";
78    }
79
80    echo "--- 処理が終了しました --- \n";
81}
82
83// 関数を実行します。
84createAndCompressImagesArchive();
85

このサンプルコードは、PHPのPharData::compressメソッドを利用して、複数の画像ファイルをまとめてGZIP形式の圧縮アーカイブ(.tar.gzファイル)を作成する手順を示しています。

コードを実行するには、php.ini設定ファイルでphar.readonlyOffにするか、コマンド実行時に-d phar.readonly=0オプションを指定する必要があります。

まず、ダミーの画像ファイルを含む一時ディレクトリを作成します。次に、PharDataクラスのインスタンスを生成し、buildFromDirectoryメソッドを使ってこの一時ディレクトリの内容から非圧縮の.tarアーカイブを作成します。

その後、作成された非圧縮アーカイブに対してPharData::compressメソッドを呼び出します。このメソッドの最初の引数には、Phar::GZのように圧縮形式を指定する定数を渡します。オプションの第二引数で、圧縮後のファイル拡張子を指定することも可能です。compressメソッドが正常に実行されると、元の非圧縮.tarファイルは自動的に削除され、新しく圧縮された.tar.gzアーカイブを表すPharDataオブジェクトが戻り値として返されます。これにより、複数の画像を一つの圧縮ファイルとして効率的に管理できるようになります。最後に、作成した一時ファイルやディレクトリがクリーンアップされます。

このサンプルコードを実行するには、php.iniphar.readonly設定をOffにするか、コマンドラインで-d phar.readonly=0オプションを指定する必要があります。これはPharアーカイブを作成・変更する際の必須事項です。PharData::compressメソッドが成功すると、元の非圧縮アーカイブファイル(例えば.tar)は自動的に削除され、新しい圧縮済みアーカイブが生成される点に注意してください。一時的に作成したファイルやディレクトリは、処理完了後に必ずクリーンアップすることが重要です。エラーが発生した際はPharExceptionを捕捉し、適切なエラーメッセージを表示することで、問題解決に役立ちます。圧縮形式はPhar::GZのような定数で指定します。

PHP PharData::compress でアーカイブを圧縮する

1<?php
2
3// PharData::compress メソッドの使用例
4// このスクリプトは、PharDataアーカイブを作成し、GZIP形式で圧縮する方法を示します。
5//
6// 対象読者: システムエンジニアを目指す初心者
7// PHPバージョン: 8以上
8// 必要なPHP拡張: Phar
9
10// Phar拡張がPHPにロードされているか確認
11if (!extension_loaded('phar')) {
12    echo "エラー: Phar拡張がロードされていません。php.ini設定を確認してください。\n";
13    exit(1);
14}
15
16// 作業用の一時ディレクトリとファイルパスを定義
17$tempDir = __DIR__ . '/phar_compress_example_data'; // 一時ファイルの保存場所
18$dummyFileName = $tempDir . '/test_content.txt';    // アーカイブに入れるダミーファイル
19$archiveBaseName = 'my_archive';                     // アーカイブの基本名
20$uncompressedArchivePath = $tempDir . '/' . $archiveBaseName . '.tar'; // 圧縮前のアーカイブ名
21$compressedArchivePath = $tempDir . '/' . $archiveBaseName . '.tar.gz'; // GZIP圧縮後のアーカイブ名
22
23try {
24    // 1. 作業ディレクトリの準備とダミーファイルの作成
25    // アーカイブ作成のための一時ディレクトリが存在しない場合、作成します。
26    if (!is_dir($tempDir)) {
27        mkdir($tempDir);
28        echo "作業ディレクトリを作成しました: " . basename($tempDir) . "\n";
29    }
30    // アーカイブに含めるダミーファイルを作成します。
31    file_put_contents($dummyFileName, "これはアーカイブに含めるテストデータです。\n複数の行を持つテキストです。\n");
32    echo "ダミーファイルを作成しました: " . basename($dummyFileName) . " (" . filesize($dummyFileName) . " バイト)\n";
33
34    // 2. 非圧縮のPharDataアーカイブ (.tar) を作成
35    // PharDataオブジェクトのコンストラクタにファイルパスを指定し、新しいアーカイブを作成します。
36    $pharData = new PharData($uncompressedArchivePath);
37    // 作成したダミーファイルをアーカイブに追加します。
38    // 第二引数はアーカイブ内でのファイル名です。
39    $pharData->addFile($dummyFileName, 'test_content.txt');
40    echo "\n非圧縮アーカイブを作成しました: " . basename($uncompressedArchivePath) . " (" . filesize($uncompressedArchivePath) . " バイト)\n";
41
42    // 3. PharDataアーカイブをGZIP形式で圧縮
43    echo "\nアーカイブをGZIP形式で圧縮します...\n";
44    // compressメソッドを呼び出し、第一引数に Phar::GZ (GZIP圧縮) を指定します。
45    // このメソッドは、元の非圧縮アーカイブファイル (.tar) を削除し、
46    // 新しいGZIP圧縮されたアーカイブファイル (.tar.gz) を作成します。
47    $compressedPharData = $pharData->compress(Phar::GZ);
48
49    // 圧縮後のアーカイブファイルが存在することを確認し、その情報を表示します。
50    if (file_exists($compressedArchivePath)) {
51        echo "GZIP圧縮アーカイブが作成されました: " . basename($compressedArchivePath) . " (" . filesize($compressedArchivePath) . " バイト)\n";
52    } else {
53        echo "エラー: GZIP圧縮アーカイブの作成に失敗しました。\n";
54    }
55
56    // 元の非圧縮アーカイブが削除されたことを確認します。
57    if (!file_exists($uncompressedArchivePath)) {
58        echo "元の非圧縮アーカイブ (" . basename($uncompressedArchivePath) . ") は削除されました。\n";
59    } else {
60        echo "警告: 元の非圧縮アーカイブ (" . basename($uncompressedArchivePath) . ") が残っています。\n";
61    }
62
63} catch (Exception $e) {
64    // 処理中にエラーが発生した場合、メッセージを表示します。
65    echo "\nエラーが発生しました: " . $e->getMessage() . "\n";
66} finally {
67    // 4. クリーンアップ: 作成したファイルとディレクトリを削除
68    echo "\nクリーンアップを実行します...\n";
69    // 作成した一時ファイルを削除します。
70    if (file_exists($dummyFileName)) {
71        unlink($dummyFileName);
72    }
73    // エラー発生時などに残っている可能性のある非圧縮アーカイブを削除します。
74    if (file_exists($uncompressedArchivePath)) {
75        unlink($uncompressedArchivePath);
76    }
77    // 圧縮されたアーカイブを削除します。
78    if (file_exists($compressedArchivePath)) {
79        unlink($compressedArchivePath);
80    }
81    // 作業ディレクトリが空であれば削除します。('.' と '..' のみの場合)
82    if (is_dir($tempDir) && count(scandir($tempDir)) == 2) {
83        rmdir($tempDir);
84        echo "作業ディレクトリを削除しました。\n";
85    } else if (is_dir($tempDir)) {
86        echo "警告: 作業ディレクトリ '" . basename($tempDir) . "' 内にファイルが残っています。\n";
87    }
88    echo "クリーンアップ完了。\n";
89}
90

PharData::compressメソッドは、既存のPharDataアーカイブファイルを指定した形式で圧縮するための機能を提供します。このサンプルコードは、まずPhar拡張を利用して非圧縮のTARアーカイブを作成し、その後GZIP形式で圧縮する一連の手順をシステムエンジニアを目指す初心者向けに示しています。

コードでは、一時ファイルを作成し、それをPharDataオブジェクトに追加して、非圧縮の.tarアーカイブを生成します。次に、$pharData->compress(Phar::GZ)を呼び出します。第一引数$compressionには、Phar::GZ(GZIP圧縮)やPhar::BZ2(BZIP2圧縮)のような定数を指定することで、圧縮形式を選択できます。オプションの第二引数$extensionを使用すると、圧縮後のファイル拡張子を任意に設定できますが、指定しない場合はデフォルトの拡張子が適用されます。

このメソッドが実行されると、元の非圧縮アーカイブファイル(例:.tar)は削除され、新たに圧縮されたアーカイブファイル(例:.tar.gz)が作成されます。メソッドの戻り値は、新しく作成された圧縮済みアーカイブを表すPharDataオブジェクトです。この機能を利用するには、PHPのPhar拡張がPHPにロードされている必要があります。コードは、アーカイブの作成から圧縮、そして一時ファイルのクリーンアップまでを順序立てて実行し、その結果を確認します。

このサンプルコードのPharData::compressメソッドは、元の非圧縮アーカイブファイルを削除し、新しい圧縮アーカイブを作成します。この挙動は特に注意が必要です。圧縮形式はPhar::GZの他にPhar::BZ2も利用可能です。スクリプト実行前には、PHPのphar拡張がphp.iniで有効になっているか必ず確認してください。また、一時的なファイルやディレクトリは適切な書き込み権限のある場所に作成し、処理完了後には必ずクリーンアップを行い、ファイルが残存しないように管理することが重要です。

関連コンテンツ