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

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

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

作成日: 更新日:

基本的な使い方

getCompressedSizeメソッドは、Pharアーカイブ内のファイルの圧縮されたサイズを取得するメソッドです。

このメソッドは、PHPアプリケーションの配布やデプロイを容易にするPharアーカイブにおいて、個々のファイルに関する情報を提供するPharFileInfoクラスに属しています。Pharアーカイブは、複数のPHPスクリプトやその他のリソースを一つのアーカイブファイルにまとめることができる仕組みです。PharFileInfoオブジェクトは、そのアーカイブ内に含まれる特定のファイルやディレクトリを表現します。

getCompressedSizeメソッドを実行すると、対象のファイルがPharアーカイブ内でZLIBやBZIP2などの圧縮アルゴリズムによって圧縮された後の、実際のバイト単位のサイズが整数値で返されます。この値は、ファイルが圧縮される前の元のサイズ(非圧縮サイズ)とは異なり、ディスク上で実際に消費されているストレージ容量を示します。

このメソッドを利用することで、Pharアーカイブ内の各ファイルがどの程度ディスク容量を節約しているかを把握したり、アーカイブ全体のストレージ効率を評価したりすることが可能になります。ファイルサイズを最適化する際や、アーカイブの内容を分析する際に役立つ情報です。

構文(syntax)

1<?php
2// $pharFileInfo は PharFileInfo クラスのインスタンスです。
3$compressedSize = $pharFileInfo->getCompressedSize();
4?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

PharFileInfo::getCompressedSizeは、圧縮されたファイル(.pharファイル)のサイズをバイト単位で整数(int)で返します。

サンプルコード

PharFileInfo::getCompressedSizeで圧縮サイズを取得する

1<?php
2
3/**
4 * PharFileInfo::getCompressedSize メソッドの使用例を示します。
5 * このメソッドは、Pharアーカイブ内のファイルが圧縮された後のサイズを返します。
6 *
7 * この関数は以下の手順で動作します:
8 * 1. テスト用のダミーファイルを作成します。
9 * 2. そのダミーファイルを使用してPharアーカイブを作成し、ファイルを追加・圧縮します。
10 * 3. 作成したPharアーカイブを開き、内部のファイル情報を取得します。
11 * 4. PharFileInfoオブジェクトから getCompressedSize() メソッドを呼び出し、圧縮後のサイズを表示します。
12 * 5. 最後に、作成したPharアーカイブとダミーファイルをクリーンアップ(削除)します。
13 */
14function demonstratePharCompressedSize(): void
15{
16    // 一時的なPharアーカイブのファイル名と、アーカイブに追加するファイル名を設定
17    $pharFileName = 'example_archive.phar';
18    $fileInPhar = 'testfile_for_phar.txt';
19    $tempDirectory = sys_get_temp_dir() . DIRECTORY_SEPARATOR; // 一時ディレクトリを使用
20
21    $fullPharPath = $tempDirectory . $pharFileName;
22    $fullFilePath = $tempDirectory . $fileInPhar;
23
24    try {
25        // 既存のPharアーカイブを削除して、テストをクリーンな状態にする
26        if (file_exists($fullPharPath)) {
27            unlink($fullPharPath);
28        }
29
30        // 1. テスト用のダミーファイルを作成
31        // 1KB (1000バイト) の内容を持つファイルを作成します。
32        $testFileContent = str_repeat('A', 1000);
33        file_put_contents($fullFilePath, $testFileContent);
34        echo "テストファイル '{$fullFilePath}' を作成しました。元サイズ: " . strlen($testFileContent) . " バイト\n";
35
36        // 2. Pharアーカイブを作成し、ファイルを追加・圧縮
37        // PharクラスはPharアーカイブの作成、読み込み、変更を行うための主要なクラスです。
38        $phar = new Phar($fullPharPath, 0, $pharFileName);
39        // Pharアーカイブが正しく機能するための最小限のスタブを設定します。
40        $phar->setStub('<?php __HALT_COMPILER(); ?>');
41
42        // バッファリングを開始し、複数のファイル追加や変更を効率的に行います。
43        $phar->startBuffering();
44        // ダミーファイルをPharアーカイブに追加します。
45        $phar->addFile($fullFilePath, $fileInPhar);
46        // Pharアーカイブ内のファイルをGZIP形式で圧縮します。
47        $phar->compressFiles(Phar::GZ); // 他に Phar::BZ2 も利用可能
48
49        // バッファリングを終了し、全ての変更をPharアーカイブに書き込みます。
50        $phar->stopBuffering();
51        echo "Pharアーカイブ '{$fullPharPath}' を作成し、'{$fileInPhar}' を追加・圧縮しました。\n";
52
53        // 3. 作成したPharアーカイブを読み込みモードで開く
54        // これにより、アーカイブ内のファイル情報にアクセスできます。
55        $pharRead = new Phar($fullPharPath);
56
57        // 4. Pharアーカイブ内の特定のエントリ(ファイル)の情報を取得
58        // PharFileInfoは、Pharアーカイブ内の個々のファイルに関する情報を提供します。
59        // ArrayAccessを利用して、ファイル名でPharFileInfoオブジェクトを取得します。
60        $pharFileInfo = $pharRead[$fileInPhar];
61
62        if ($pharFileInfo instanceof PharFileInfo) {
63            // 5. getCompressedSize メソッドを呼び出し、圧縮後のサイズを取得
64            // getCompressedSize() は、Pharアーカイブ内のエントリの圧縮後のサイズをバイト単位で返します。
65            $compressedSize = $pharFileInfo->getCompressedSize();
66            echo "Pharアーカイブ内の '{$fileInPhar}' の圧縮後のサイズ: {$compressedSize} バイト\n";
67
68            // 比較のために非圧縮時のサイズも表示
69            $uncompressedSize = $pharFileInfo->getUncompressedSize();
70            echo "Pharアーカイブ内の '{$fileInPhar}' の非圧縮サイズ (オリジナル): {$uncompressedSize} バイト\n";
71        } else {
72            echo "エラー: Pharアーカイブ内の '{$fileInPhar}' のファイル情報を取得できませんでした。\n";
73        }
74
75    } catch (Exception $e) {
76        // エラーが発生した場合、メッセージを表示します。
77        echo "エラーが発生しました: " . $e->getMessage() . "\n";
78    } finally {
79        // 6. クリーンアップ: 作成したファイルとPharアーカイブを削除
80        // オブジェクトの参照を解除することで、ファイルロックが解除され、ファイルの削除が可能になります。
81        $phar = null;
82        $pharRead = null;
83
84        if (file_exists($fullFilePath)) {
85            unlink($fullFilePath);
86            echo "テストファイル '{$fullFilePath}' を削除しました。\n";
87        }
88        if (file_exists($fullPharPath)) {
89            // ファイルの削除が失敗した場合に備えて警告を表示
90            if (!unlink($fullPharPath)) {
91                echo "警告: Pharアーカイブ '{$fullPharPath}' の削除に失敗しました。手動で削除する必要があるかもしれません。\n";
92            } else {
93                echo "Pharアーカイブ '{$fullPharPath}' を削除しました。\n";
94            }
95        }
96    }
97}
98
99// サンプルコードを実行します。
100demonstratePharCompressedSize();
101
102?>

PharFileInfo::getCompressedSizeメソッドは、PHPのPhar拡張機能において、Pharアーカイブ内に保存されている特定のファイルが、圧縮された後に実際に占めるサイズをバイト単位で取得するために使用されます。このメソッドはPharFileInfoクラスに属しており、PharFileInfoオブジェクトはPharアーカイブ内の個々のファイルに関する情報を提供します。

引数は不要で、呼び出すだけで圧縮後のファイルサイズを整数値(int)として返します。

サンプルコードでは、まずテスト用のダミーファイルを作成し、それをGZIP形式で圧縮してPharアーカイブに追加しています。その後、作成されたPharアーカイブから対象ファイルのPharFileInfoオブジェクトを取得し、getCompressedSize()メソッドを呼び出して圧縮後のファイルサイズを表示します。これにより、元の非圧縮サイズと比較して、圧縮によってファイルサイズがどれだけ削減されたかを確認できます。この機能は、Pharアーカイブのディスク使用量を正確に把握したい場合や、ネットワーク経由でPharファイルを転送する際の帯域幅予測などに役立ちます。

このサンプルコードを利用する際は、まずPHPのPhar拡張機能がphp.iniで有効になっているか確認してください。getCompressedSize()メソッドはPharアーカイブ内のファイルが実際に圧縮された後のサイズを返します。圧縮されていないファイルに対しては、非圧縮時のサイズと同じ値になるため、どの圧縮形式が適用されているかを把握することが重要です。Pharアーカイブの作成や変更にはPharクラスを、アーカイブ内の個々のファイル情報にはPharFileInfoクラスを使いますが、アーカイブ作成時と読み込み時でインスタンスの扱いが異なる点に注意が必要です。一時的なファイル操作を行うため、実行環境のパス指定やファイルの削除失敗に備え、エラー処理とクリーンアップの徹底が重要です。特に実運用では、ファイルの格納パスやセキュリティに配慮してください。

PharFileInfo::getCompressedSize で圧縮サイズを取得する

1<?php
2
3/**
4 * PHARアーカイブ内のファイルの圧縮サイズを取得するサンプルコード
5 *
6 * PHPのPharアーカイブ内のファイルは、通常のファイルシステム上のファイルとは異なるため、
7 * その情報取得に際して「php getimagesize 取得できない」といった問題に遭遇することがあります。
8 * 例えば、画像ファイルがPharアーカイブ内に含まれている場合、通常のgetimagesize()関数では
9 * そのファイルに直接アクセスして情報を取得することができません。
10 *
11 * このような場合、PharFileInfoクラスを使用することで、アーカイブ内のファイルに関する
12 * 詳細な情報を取得できます。この例では、PharFileInfo::getCompressedSize() メソッドを使って、
13 * アーカイブに追加されたファイルの圧縮後のサイズを取得する方法を示します。
14 */
15
16// PHARファイルの書き込みを許可する (開発環境でのみ推奨。本番環境では phar.readonly = 1 が安全です)
17ini_set('phar.readonly', 0);
18
19// 一時的なファイル名とPHARアーカイブ名を設定
20$tempFileName = 'dummy_file.txt'; // PHARアーカイブに追加するダミーファイル
21$pharFileName = 'my_archive.phar';
22$filePathInPhar = 'data/' . $tempFileName; // PHARアーカイブ内でのパス
23
24try {
25    // 1. PHARアーカイブに追加するダミーファイルを一時的に作成
26    $dummyContent = str_repeat('This is a dummy content for testing purposes.', 1000); // 圧縮効果を見るため少し長めに
27    file_put_contents($tempFileName, $dummyContent);
28    echo "ダミーファイル '{$tempFileName}' を作成しました。\n";
29
30    // 2. PHARアーカイブを作成
31    echo "PHARアーカイブ '{$pharFileName}' を作成中...\n";
32    $phar = new Phar($pharFileName);
33
34    // PHARファイルを書き込み可能モードに設定し、バッファリングを開始
35    $phar->startBuffering();
36
37    // ダミーファイルをアーカイブに追加し、GZIPで圧縮
38    $phar->addFile($tempFileName, $filePathInPhar);
39    $phar->compressFiles(Phar::GZ); // PHARアーカイブ内のファイルをGZIP圧縮
40
41    // バッファリングを終了し、PHARアーカイブを保存
42    $phar->stopBuffering();
43    echo "PHARアーカイブ '{$pharFileName}' にファイルを追加し、圧縮しました。\n";
44
45    // 3. 作成されたPHARアーカイブを読み込みモードで開く
46    echo "PHARアーカイブ '{$pharFileName}' からファイル情報を取得中...\n";
47    $pharRead = new Phar($pharFileName); // 読み取りモードでPharをインスタンス化
48    
49    // 特定のファイルに対するPharFileInfoオブジェクトを取得
50    if (isset($pharRead[$filePathInPhar])) {
51        $fileInfo = $pharRead[$filePathInPhar];
52
53        // 4. getCompressedSize() メソッドで圧縮後のサイズを取得
54        $compressedSize = $fileInfo->getCompressedSize();
55        echo "PHARアーカイブ内のファイル '{$filePathInPhar}' の圧縮サイズ: " . $compressedSize . " バイト\n";
56
57        // 参考: 圧縮前の非圧縮サイズも取得
58        $uncompressedSize = $fileInfo->getSize();
59        echo "PHARアーカイブ内のファイル '{$filePathInPhar}' の非圧縮サイズ: " . $uncompressedSize . " バイト\n";
60        echo "圧縮により " . ($uncompressedSize - $compressedSize) . " バイト節約されました。\n";
61
62    } else {
63        echo "エラー: PHARアーカイブ内にファイル '{$filePathInPhar}' が見つかりませんでした。\n";
64    }
65
66} catch (PharException $e) {
67    echo "PHAR操作エラー: " . $e->getMessage() . "\n";
68    if (strpos($e->getMessage(), 'phar.readonly') !== false) {
69        echo "ヒント: php.ini の 'phar.readonly' が '0' に設定されているか確認してください。\n";
70    }
71} catch (Exception $e) {
72    echo "一般的なエラー: " . $e->getMessage() . "\n";
73} finally {
74    // 後処理: 作成した一時ファイルとPHARアーカイブを削除
75    if (file_exists($tempFileName)) {
76        unlink($tempFileName);
77        echo "ダミーファイル '{$tempFileName}' を削除しました。\n";
78    }
79    if (file_exists($pharFileName)) {
80        unlink($pharFileName);
81        echo "PHARアーカイブ '{$pharFileName}' を削除しました。\n";
82    }
83}
84
85?>

このサンプルコードは、PHPのPHARアーカイブ内に保存されたファイルの圧縮後のサイズを取得する方法を具体的に示しています。PHARアーカイブは、複数のファイルを一つの実行可能なアーカイブにまとめる仕組みであり、その内部のファイルは通常のファイルシステム上のファイルとは異なる特性を持ちます。そのため、例えばgetimagesize()のような一般的なファイル操作関数では、アーカイブ内のファイルに直接アクセスして情報を取得することができません。このような場合に、PharFileInfoクラスを利用してアーカイブ内のファイル情報を詳細に扱うことが可能です。

PharFileInfo::getCompressedSize()メソッドは、引数を一切取らずに呼び出すことで、対象のファイルがPHARアーカイブ内でどれくらいのサイズに圧縮されているかを整数値(バイト数)で返します。サンプルコードでは、まずダミーファイルを作成し、それをGZIP圧縮してmy_archive.pharというPHARアーカイブに追加しています。その後、作成したアーカイブを読み込みモードで開き、追加したファイルのPharFileInfoオブジェクトを取得しています。このオブジェクトに対してgetCompressedSize()を呼び出すことにより、圧縮後のサイズが正確に取得され、コンソールに表示されます。また、圧縮前の非圧縮サイズも同時に取得して表示することで、圧縮によるサイズ削減効果も確認できるようになっています。このメソッドは、PHARアーカイブ内のファイル管理や最適化において重要な情報を提供します。

このサンプルコードは、PHPのPharアーカイブ内のファイル情報を安全に扱うための重要なポイントを示しています。まず、アーカイブの作成や書き込みには一時的にphar.readonly設定を0にする必要がありますが、本番環境ではセキュリティのため1に設定し、Pharアーカイブが改変されないようにすることが非常に重要です。

getCompressedSize()メソッドは、Pharアーカイブに格納されたファイルの「圧縮後のサイズ」を返します。通常のgetSize()メソッドが返す非圧縮サイズと比較することで、圧縮による効果を確認できます。

また、getimagesize()のような通常のファイルシステム関数はPharアーカイブ内のファイルには直接適用できないため、アーカイブ内のファイルにアクセスする際は、Pharクラスを通じてPharFileInfoオブジェクトを取得し、それらの専用メソッドを利用する必要があります。Phar操作は予期せぬエラーが発生しやすいため、サンプルコードのようにtry-catchブロックでPharExceptionを適切に処理し、一時ファイルを確実に削除する後処理を行うことが堅牢なシステム開発において不可欠です。

関連コンテンツ

関連IT用語

関連プログラミング言語