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

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

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

作成日: 更新日:

基本的な使い方

compressメソッドは、Pharアーカイブ内の特定のファイルエントリを指定された形式で圧縮するメソッドです。PharFileInfoクラスは、Pharアーカイブ内の個々のファイルエントリ(Pharアーカイブに格納されているファイルやディレクトリ)の情報を表します。このcompressメソッドは、そのファイルエントリに対して圧縮処理を適用し、アーカイブ内のファイルデータの実効サイズを削減します。

具体的には、このメソッドを呼び出すことで、対象となるPharファイルエントリのデータが、Phar::GZ(gzip圧縮)やPhar::BZ2(bzip2圧縮)といった定数で指定された圧縮形式に変換されます。これにより、Pharアーカイブ全体のファイルサイズを効果的に削減し、ストレージ容量の節約やネットワーク転送速度の向上に貢献します。

メソッドは、圧縮形式を表す定数を引数として受け取ります。圧縮が成功した場合は真(true)を返し、ファイルデータは新しい圧縮形式で更新されます。圧縮に失敗した場合は偽(false)を返します。例えば、既に圧縮されているファイルをさらに圧縮しようとしたり、サポートされていない圧縮形式を指定したりするとエラーが発生する可能性があるため、適切な形式の指定が重要です。特に、PHPアプリケーションをPhar形式で配布する際に、パッケージのサイズを最適化し、配布効率を高めるために重要な役割を果たします。

構文(syntax)

1$pharFileInfoInstance->compress(Phar::GZ);

引数(parameters)

int $compression, ?string $filename = null

  • int $compression: Pharアーカイブの圧縮方法を指定する整数。Phar::GZ, Phar::BZ2, Phar::NONEなどを指定します。
  • ?string $filename = null: 圧縮後のPharアーカイブを保存するファイル名を指定する文字列。省略した場合は、元のPharアーカイブが上書きされます。

戻り値(return)

bool

このメソッドは、Pharアーカイブの圧縮を試みた結果を真偽値で返します。圧縮が成功した場合は true を、失敗した場合は false を返します。

サンプルコード

Pharアーカイブ内画像ファイルのGzip圧縮

1<?php
2
3// エラー報告を有効にする
4error_reporting(E_ALL);
5ini_set('display_errors', '1');
6
7/**
8 * Pharアーカイブ内の画像ファイルをGzip圧縮するサンプルコード。
9 *
10 * この関数は、システムエンジニアを目指す初心者がPharFileInfo::compressメソッドの
11 * 基本的な使い方を理解できるように設計されています。
12 * 実際には、既存の画像ファイルをPharアーカイブに追加し、そのファイルに対して圧縮を行います。
13 */
14function compressPharImageExample(): void
15{
16    // 1. Pharアーカイブとテスト用画像ファイルのパスを定義
17    $pharPath = __DIR__ . '/my_compressed_images.phar';
18    $sourceImagePath = __DIR__ . '/test_image.jpg'; // 圧縮したい元の画像ファイルパス
19
20    // 既存のPharファイルを削除(テストを繰り返し実行できるようにするため)
21    if (file_exists($pharPath)) {
22        unlink($pharPath);
23        echo "既存のPharファイル '{$pharPath}' を削除しました。\n";
24    }
25
26    try {
27        // 2. テスト用の画像ファイルを生成 (実際にはここに既存の画像ファイルを置きます)
28        // 圧縮効果を確認しやすくするため、少し大きめのダミーデータを生成します。
29        // Gzipは繰り返し文字を効率よく圧縮します。
30        if (!file_exists($sourceImagePath)) {
31            $dummyContent = str_repeat('This is a dummy image content for testing compression.', 100); // 約5KBのダミーデータ
32            file_put_contents($sourceImagePath, $dummyContent);
33            echo "テスト用画像ファイル '{$sourceImagePath}' (~5KB) を作成しました。\n";
34        }
35
36        // 3. 新しいPharアーカイブを作成
37        // 第二引数: 0 は特別なフラグなし。
38        // 第三引数: 'my_compressed_images.phar' はアーカイブのエイリアスで、URLとして参照する際に使用されます。
39        $phar = new Phar($pharPath, 0, 'my_compressed_images.phar');
40        // バッファリングを開始し、ファイル追加や操作を高速化します。
41        $phar->startBuffering();
42
43        // 4. テスト用画像ファイルをPharアーカイブに追加
44        $internalFileName = 'images/original_photo.jpg'; // Pharアーカイブ内のパス
45        $phar->addFile($sourceImagePath, $internalFileName);
46        echo "画像ファイル '{$sourceImagePath}' をPharアーカイブ内 '{$internalFileName}' として追加しました。\n";
47
48        // 5. 追加したファイルのPharFileInfoオブジェクトを取得
49        // このオブジェクトを通じてPharアーカイブ内のファイルにアクセスし、操作します。
50        $fileInfo = $phar[$internalFileName];
51
52        // 圧縮前のファイルサイズを表示
53        echo "圧縮前のファイルサイズ: " . $fileInfo->getSize() . " バイト\n";
54
55        // 6. PharFileInfo::compress メソッドで画像ファイルをGzip圧縮
56        // 第一引数: Phar::GZ はGzip圧縮を指定する定数です (他に Phar::BZ2 があります)。
57        // 第二引数: null は元のファイルを上書きして圧縮することを意味します。
58        $success = $fileInfo->compress(Phar::GZ, null);
59
60        if ($success) {
61            echo "Pharアーカイブ内の '{$internalFileName}' をGzip圧縮しました。\n";
62
63            // 圧縮後のファイルサイズを再度取得して表示
64            // compressメソッドが呼び出されると、Pharアーカイブ内のファイル情報が更新されます。
65            echo "圧縮後のファイルサイズ: " . $fileInfo->getSize() . " バイト\n";
66        } else {
67            echo "Pharアーカイブ内の '{$internalFileName}' の圧縮に失敗しました。\n";
68        }
69
70        // 7. バッファリングを終了し、Pharアーカイブへの変更をディスクに書き込みます。
71        $phar->stopBuffering();
72        echo "Pharアーカイブ '{$pharPath}' を作成/更新しました。\n";
73
74    } catch (Exception $e) {
75        // エラー発生時の処理
76        echo "エラーが発生しました: " . $e->getMessage() . "\n";
77        // エラーが発生した場合もPharファイルをクリーンアップします。
78        if (file_exists($pharPath)) {
79            unlink($pharPath);
80        }
81    } finally {
82        // クリーンアップ: テスト用ダミー画像ファイルを削除 (オプション)
83        // 実際の運用では、ソースファイルを削除するかどうかは要件によります。
84        if (file_exists($sourceImagePath)) {
85            unlink($sourceImagePath);
86            echo "テスト用画像ファイル '{$sourceImagePath}' を削除しました。\n";
87        }
88    }
89}
90
91// サンプルコードを実行します。
92compressPharImageExample();
93
94?>

PharFileInfo::compressメソッドは、PHPのPharアーカイブ内に保存された個々のファイルを指定した形式で圧縮するために使用されます。

このメソッドの第一引数 $compression には、圧縮形式を整数値で指定します。例えば、Phar::GZを指定するとGzip形式で、Phar::BZ2を指定するとBzip2形式で圧縮されます。第二引数 $filename はオプションで、圧縮後の新しいファイル名を指定できます。nullを指定した場合は、元のファイルを上書きして圧縮が実行されます。メソッドの戻り値は bool 型で、圧縮処理が成功した場合は true、失敗した場合は false を返します。

サンプルコードでは、まずPharアーカイブを作成し、テスト用のダミー画像ファイルを追加しています。その後、追加された画像ファイルのPharFileInfoオブジェクトを取得し、そのオブジェクトのcompressメソッドをPhar::GZを引数に指定して呼び出すことで、アーカイブ内の画像ファイルをGzip圧縮しています。圧縮前後のファイルサイズを表示することで、実際にファイルが圧縮されたことを確認でき、Pharアーカイブ内で画像のようなリソースを効率的に管理・配信する際の基本的な圧縮方法を理解できます。

このサンプルコードは、Pharアーカイブの基本的な操作と、アーカイブ内の特定のファイルを圧縮する方法を示しています。PharファイルはstartBuffering()で操作を開始し、変更をstopBuffering()でディスクに保存する一連の流れが重要です。PharFileInfo::compressメソッドは、直接ディスク上のファイルを圧縮するものではなく、Pharアーカイブ内に既に追加されたファイルをGzipやBzip2形式で圧縮するものです。第一引数でPhar::GZなどの圧縮形式を指定し、第二引数をnullにすると、Pharアーカイブ内の元のファイルが圧縮済みの内容で上書きされますので注意が必要です。ファイル操作を伴うため、例外処理を適切に記述し、処理後には生成した一時ファイルを忘れずにクリーンアップすることが、安全で堅牢なコード利用の鍵となります。

PHP PharFileInfo::compress でファイルを圧縮する

1<?php
2
3/**
4 * Pharアーカイブ内の個別のファイルを圧縮するサンプルコード。
5 * PharFileInfo::compress メソッドの使用方法を示します。
6 *
7 * このスクリプトは、一時的なPharアーカイブを作成し、その中の1つのファイルをGZIP形式で圧縮します。
8 * (Phar::GZ を使用するには zlib 拡張機能が必要です。Phar::BZ2 を使用するには bz2 拡張機能が必要です。)
9 */
10function compressPharIndividualFile(): void
11{
12    // 注意: PHP設定で phar.readonly が '1' になっていると、Pharファイルの作成・変更ができません。
13    // その場合は、php.ini を修正するか、コマンドラインで 'php -d phar.readonly=0 your_script.php' のように実行してください。
14    if (ini_get('phar.readonly') === '1') {
15        echo "エラー: php.ini の 'phar.readonly' が '1' に設定されているため、Pharファイルの作成・変更ができません。\n";
16        echo "スクリプトを実行する前に設定を '0' に変更するか、コマンドラインで '-d phar.readonly=0' オプションを使用してください。\n";
17        return;
18    }
19
20    $pharFileName = __DIR__ . '/my_sample.phar'; // 作成するPharファイル名
21    $sourceFileName = 'content.txt'; // Pharに追加する元のファイル名
22    $sourceFilePath = __DIR__ . '/' . $sourceFileName; // 元ファイルのフルパス
23    $fileContent = "これはPharアーカイブに含めるテストファイルの内容です。\n圧縮されます。\n";
24
25    // スクリプト終了時に作成したファイルを自動的に削除するためのクリーンアップ関数を登録
26    register_shutdown_function(function () use ($pharFileName, $sourceFilePath) {
27        if (file_exists($pharFileName)) {
28            unlink($pharFileName);
29            echo "Pharファイル {$pharFileName} を削除しました。\n";
30        }
31        if (file_exists($sourceFilePath)) {
32            unlink($sourceFilePath);
33            echo "ソースファイル {$sourceFilePath} を削除しました。\n";
34        }
35    });
36
37    try {
38        // 1. テスト用のソースファイルを作成
39        file_put_contents($sourceFilePath, $fileContent);
40        echo "ソースファイル {$sourceFilePath} を作成しました。\n";
41
42        // 2. 新しいPharアーカイブを作成し、ファイルを追加
43        $phar = new Phar($pharFileName);
44        $phar->startBuffering(); // 書き込み操作の効率化のためにバッファリングを開始
45
46        // ソースファイルをPharアーカイブに追加
47        // 第2引数でアーカイブ内のパスを指定します
48        $phar->addFile($sourceFilePath, $sourceFileName);
49        echo "ファイル '{$sourceFileName}' をPharアーカイブに追加しました。\n";
50
51        $phar->stopBuffering(); // バッファリングを停止し、変更をPharファイルに書き込む
52        echo "Pharアーカイブ {$pharFileName} を作成しました。\n";
53
54        // 3. Pharアーカイブから対象ファイルの PharFileInfo オブジェクトを取得
55        // 新しいPharオブジェクトを読み込みモードで開くことで、内部ファイルにアクセスできます。
56        $pharReadOnly = new Phar($pharFileName);
57        $pharFileInfo = $pharReadOnly[$sourceFileName];
58
59        // 4. PharFileInfo::compress メソッドを使用してファイルをGZIP形式で圧縮
60        echo "ファイル '{$sourceFileName}' をGZIP形式で圧縮しています... ";
61        $success = $pharFileInfo->compress(Phar::GZ);
62
63        if ($success) {
64            echo "成功しました。\n";
65            // 圧縮が成功しても、ファイル名自体は通常変更されませんが、
66            // Phar内部ではそのファイルが圧縮済みとして管理されます。
67            // 実際にファイルが圧縮されたことを確認するには、Pharアーカイブを再度開き、
68            // そのファイルの内容を読み込む必要がありますが、ここでは簡潔さのため省略します。
69            // 例: echo "圧縮後のファイルサイズ (Phar内部表現): " . $pharFileInfo->getSize() . " バイト\n";
70        } else {
71            echo "失敗しました。\n";
72        }
73
74    } catch (PharException $e) {
75        echo "Phar関連のエラーが発生しました: " . $e->getMessage() . "\n";
76    } catch (Exception $e) {
77        echo "予期せぬエラーが発生しました: " . $e->getMessage() . "\n";
78    }
79}
80
81// 関数を実行
82compressPharIndividualFile();

このサンプルコードは、PHPのPharアーカイブ内部にある個別のファイルを圧縮する方法を、PharFileInfo::compressメソッドを使って示しています。Pharアーカイブとは、複数のファイルを一つのファイルにまとめるためのPHP独自の形式です。

スクリプトはまず、一時的なテキストファイルを作成し、それを新しいPharアーカイブに追加します。次に、作成されたPharアーカイブから圧縮対象ファイルのPharFileInfoオブジェクトを取得し、そのオブジェクトに対してcompressメソッドを呼び出しています。

compressメソッドの第一引数$compressionには、Phar::GZ(GZIP形式)のような圧縮形式を定数で指定します。GZIP圧縮にはzlib拡張機能、Bzip2圧縮(Phar::BZ2)にはbz2拡張機能がそれぞれ必要です。第二引数$filenameは圧縮後のファイル名を指定しますが、通常は省略され、元のアーカイブ内パスが維持されます。メソッドは圧縮処理が成功した場合はtrueを、失敗した場合はfalseを戻り値として返します。

なお、Pharアーカイブの作成や変更には、PHP設定のphar.readonly0である必要があります。このサンプルを通じて、Pharアーカイブ内の特定のファイルを柔軟に管理・圧縮する方法を学ぶことができます。

Pharアーカイブ内のファイルを圧縮する際は、PHP設定のphar.readonly0であることを確認してください。これが1のままだと、Pharファイルの作成や変更ができずエラーが発生します。また、GZIP圧縮にはzlib拡張機能、BZIP2圧縮にはbz2拡張機能がPHPにインストールされ有効になっている必要がありますので、事前の確認が不可欠です。PharFileInfo::compressメソッドは、第一引数で指定した圧縮形式が適用された場合、trueを返します。圧縮の成否を必ず確認し、エラーハンドリングを適切に実装することが重要です。サンプルコードのように一時的なファイルを作成する場合は、スクリプト終了時に忘れずに削除する処理を含めると、システムをきれいに保てます。

関連コンテンツ