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

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

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

作成日: 更新日:

基本的な使い方

getSizeメソッドは、Pharアーカイブ内の個々のファイルやディレクトリのサイズを取得するメソッドです。 このメソッドは、PHPのPhar拡張機能の一部であるPharFileInfoクラスに属しています。PharFileInfoクラスは、Phar(PHPアーカイブ)という特殊な形式でまとめられたファイル群の中から、特定のファイルやディレクトリの情報を扱う際に用いられます。Pharアーカイブは、複数のPHPファイルや関連リソースを単一のファイルにパッケージ化し、配布や実行を容易にするための、PHP独自のアーカイブ形式です。

getSizeメソッドを呼び出すと、対象となるPharFileInfoオブジェクトが表すファイルやディレクトリの正確なバイト単位のサイズを整数値として取得できます。これにより、Pharアーカイブ内に含まれる各ファイルの容量を確認したり、特定のファイルがディスク上でどの程度のスペースを占めているかをプログラムから把握したりすることが可能になります。 例えば、アプリケーションのデプロイメント時にアーカイブ内の特定のファイルのサイズ制限を超えていないかを確認する際や、サイズに基づいて処理を分岐させるような場面で役立ちます。このメソッドは引数を必要とせず、常にファイルまたはディレクトリのサイズをバイト数で返します。これにより、Pharアーカイブの内容を効率的に管理し、処理を行うことができます。

構文(syntax)

1<?php
2$phar = new Phar('my_archive.phar');
3$fileInfo = $phar['path/to/file.txt'];
4
5$fileSize = $fileInfo->getSize();
6?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

PharFileInfo::getSizeは、pharアーカイブ内のファイルサイズをバイト単位の整数で返します。

サンプルコード

PharFileInfo::getSize()でファイルサイズを取得する

1<?php
2
3/**
4 * Demonstrates how to use PharFileInfo::getSize() to get the size of a file
5 * within a PHP Archive (Phar).
6 *
7 * This function creates a temporary Phar archive, adds a file to it,
8 * then retrieves the file's size using PharFileInfo::getSize(),
9 * and finally cleans up the temporary files.
10 */
11function demonstratePharFileInfoGetSize(): void
12{
13    // Define temporary file and Phar archive paths
14    $tempDir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . uniqid('phar_demo_');
15    $pharFileName = $tempDir . DIRECTORY_SEPARATOR . 'my_archive.phar';
16    $internalFileName = 'test_file.txt';
17    $fileContent = 'This is a sample text file content for the Phar archive.';
18    $expectedSize = strlen($fileContent); // Calculate expected size in bytes
19
20    // 1. Create a temporary directory for our files
21    if (!mkdir($tempDir) && !is_dir($tempDir)) {
22        echo "Error: Failed to create temporary directory.\n";
23        return;
24    }
25
26    // 2. Create a temporary content file that will be added to the Phar
27    $filePathInTempDir = $tempDir . DIRECTORY_SEPARATOR . $internalFileName;
28    if (file_put_contents($filePathInTempDir, $fileContent) === false) {
29        echo "Error: Failed to write content to temporary file.\n";
30        // Clean up before exiting
31        @rmdir($tempDir);
32        return;
33    }
34
35    // Ensure the Phar extension is loaded
36    if (!extension_loaded('Phar')) {
37        echo "Error: The 'Phar' PHP extension is not loaded. Please enable it in your php.ini.\n";
38        // Clean up before exiting
39        @unlink($filePathInTempDir);
40        @rmdir($tempDir);
41        return;
42    }
43
44    try {
45        // 3. Create a new Phar archive
46        // The second argument '0' sets the flags to 0 (default).
47        // The third argument 'my_archive.phar' is the alias for the archive.
48        $phar = new Phar($pharFileName, 0, 'my_archive.phar');
49
50        // Set a default stub, which is necessary for the Phar to be executable.
51        // It points to the internal file 'test_file.txt' as the entry point.
52        $phar->setStub($phar->createDefaultStub($internalFileName));
53
54        // 4. Add the temporary file to the Phar archive
55        // The first argument is the path to the file on the filesystem.
56        // The second argument is the path/name the file will have inside the Phar.
57        $phar->addFile($filePathInTempDir, $internalFileName);
58
59        echo "Phar archive created: " . basename($pharFileName) . "\n";
60        echo "File '$internalFileName' added with content size: $expectedSize bytes.\n\n";
61
62        // 5. Access the file information within the Phar archive
63        // You can access files within a Phar like elements of an array.
64        // This returns a PharFileInfo object.
65        $pharFileInfo = $phar[$internalFileName];
66
67        // Check if the returned object is indeed a PharFileInfo instance
68        if ($pharFileInfo instanceof PharFileInfo) {
69            // 6. Use getSize() to get the size of the file in bytes
70            $fileSizeInPhar = $pharFileInfo->getSize();
71
72            echo "Retrieved size of '$internalFileName' within Phar: $fileSizeInPhar bytes.\n";
73
74            // Verify the size matches our expectation
75            if ($fileSizeInPhar === $expectedSize) {
76                echo "Verification successful: The size matches the original content size.\n";
77            } else {
78                echo "Verification failed: Expected $expectedSize bytes, but got $fileSizeInPhar bytes.\n";
79            }
80        } else {
81            echo "Error: Could not retrieve PharFileInfo for '$internalFileName'.\n";
82        }
83
84    } catch (Exception $e) {
85        // Catch any exceptions that might occur during Phar creation or manipulation
86        echo "An error occurred during Phar operations: " . $e->getMessage() . "\n";
87    } finally {
88        // 7. Clean up: Delete the temporary files and the Phar archive
89        echo "\nInitiating cleanup...\n";
90
91        // Delete the created Phar file
92        if (file_exists($pharFileName)) {
93            // Ensure the Phar object is destroyed/closed before unlinking
94            // If the Phar was opened read-only, it might need to be explicitly closed.
95            // For a newly created Phar, unlinking directly usually works after the Phar object goes out of scope.
96            // Using '@' to suppress warnings if the file is locked or doesn't exist.
97            if (@unlink($pharFileName)) {
98                echo "Deleted Phar archive: " . basename($pharFileName) . "\n";
99            } else {
100                echo "Warning: Could not delete Phar archive '$pharFileName'. Please delete manually if it persists.\n";
101            }
102        }
103
104        // Delete the temporary content file
105        if (file_exists($filePathInTempDir)) {
106            if (@unlink($filePathInTempDir)) {
107                echo "Deleted temporary content file: " . basename($filePathInTempDir) . "\n";
108            } else {
109                echo "Warning: Could not delete temporary content file '$filePathInTempDir'.\n";
110            }
111        }
112
113        // Delete the temporary directory
114        if (is_dir($tempDir)) {
115            if (@rmdir($tempDir)) {
116                echo "Deleted temporary directory: " . basename($tempDir) . "\n";
117            } else {
118                echo "Warning: Could not delete temporary directory '$tempDir'.\n";
119            }
120        }
121        echo "Cleanup complete.\n";
122    }
123}
124
125// Execute the demonstration function
126demonstratePharFileInfoGetSize();
127
128?>

PHPのPharFileInfo::getSize()メソッドは、PHPアプリケーションの配布形式であるPhar(PHP Archive)アーカイブ内に含まれる特定のファイルのサイズを、バイト単位で取得するための機能です。このメソッドはPharFileInfoクラスに属しており、Pharアーカイブ内のファイル情報を取り扱う際に利用されます。

引数は不要で、呼び出すと対象ファイルのサイズを表す整数値(int)を返します。

提供されたサンプルコードでは、まず一時的なPharアーカイブを作成し、任意のテキストファイルをその中に格納しています。その後、Pharアーカイブ内のそのファイルを表すPharFileInfoオブジェクトを取得し、そのオブジェクトに対してgetSize()メソッドを呼び出しています。これにより、Pharアーカイブに格納されたファイルの実際のデータサイズが正確に取得され、期待されるサイズと一致するかどうか検証する流れが示されています。ファイルサイズは常にバイト単位で報告されますので、ファイルシステム上の通常のファイルと同じように扱えます。この機能は、Pharファイルとしてパッケージ化されたアプリケーション内部のファイルに関する情報をプログラムで取得したい場合に非常に役立ちます。

このサンプルコードは、PHPのPhar拡張機能を用いて、Pharアーカイブ内のファイルサイズを取得する方法を示しています。Phar機能を利用するには、まずphp.iniPhar拡張を有効にする必要があります。getSize()メソッドは、対象ファイルのサイズをバイト単位で整数(int)として返しますが、これは一般的なファイルサイズ取得と同じ挙動です。Pharファイルは、複数のファイルを一つのアーカイブにまとめる特殊な形式のため、通常のファイル操作とは異なる専用のクラスを使います。一時的なPharアーカイブやファイルの作成と操作は、try-catch-finallyブロックで例外処理を行い、最終的に不要なファイルを確実に削除するクリーンアップ処理が非常に重要です。これにより、ディスク容量の無駄使いを防ぎ、システムの安定性を保つことができます。

関連コンテンツ