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

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

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

作成日: 更新日:

基本的な使い方

buildFromDirectoryメソッドは、指定されたディレクトリの内容から新しいアーカイブファイルを作成するメソッドです。このメソッドは、PharDataクラスが提供する機能の一つで、アプリケーションやライブラリを配布するために、複数のファイルを一つにまとめる際に使用されます。具体的には、指定したディレクトリとその内部にあるすべてのサブディレクトリ、そしてそれらに含まれるファイルをまとめて、一つのアーカイブファイルとして構築します。PharDataクラスは、PHP独自のPhar形式だけでなく、一般的なTarやZip形式のアーカイブも扱えるため、幅広い用途で利用可能です。メソッドの呼び出し時には、アーカイブに含めるファイルや除外するファイルを正規表現を使って指定できるため、必要なデータのみを厳選してパッケージ化できます。これにより、複雑なディレクトリ構造を持つプロジェクトでも、デプロイや配布を効率的に行い、管理を簡素化することが可能になります。システム開発において、ファイル群を一つのまとまりとして扱うための非常に便利な機能です。

構文(syntax)

1<?php
2$pharData = new PharData('my_archive.tar');
3$addedFiles = $pharData->buildFromDirectory('path/to/source/directory');
4?>

引数(parameters)

string $directory, ?string $pattern = null

  • string $directory: Pharアーカイブに含めるファイルが含まれるディレクトリへのパス
  • ?string $pattern = null: DirectoryIterator::SKIP_DOTS を適用したglobパターン。指定しない場合はディレクトリ内のすべてのファイルが対象となる

戻り値(return)

array<string, bool>

指定されたディレクトリ内のファイルとディレクトリを Phar アーカイブにビルドした結果を、ファイルパスをキー、成功したかどうかを示す真偽値を値とする連想配列で返します。

サンプルコード

PharData::buildFromDirectoryでディレクトリをアーカイブする

1<?php
2
3// このスクリプトは、PharData::buildFromDirectory メソッドを使って、
4// 指定されたディレクトリの内容からアーカイブファイル(例: .tar)を作成する例を示します。
5//
6// 注意: Phar の書き込みには、php.ini で 'phar.readonly = 0' が設定されている必要があります。
7// 開発環境では通常この設定ですが、本番環境ではセキュリティ上の理由から '1' の場合があります。
8
9// 作成するアーカイブファイルの名前
10$archiveFileName = 'example_archive.tar';
11// アーカイブ元となる一時ディレクトリの名前
12$sourceDirectory = 'temp_source_content';
13
14try {
15    // 1. アーカイブ元のディレクトリを作成し、テストファイルを追加します。
16    if (!mkdir($sourceDirectory) && !is_dir($sourceDirectory)) {
17        throw new RuntimeException(sprintf('ディレクトリ "%s" を作成できませんでした。', $sourceDirectory));
18    }
19    file_put_contents($sourceDirectory . '/file1.txt', 'これは最初のファイルです。');
20    file_put_contents($sourceDirectory . '/data.json', '{"name": "太郎", "age": 25}');
21    mkdir($sourceDirectory . '/subfolder');
22    file_put_contents($sourceDirectory . '/subfolder/report.log', 'ログエントリ: システム起動。');
23
24    echo "--- アーカイブ元ディレクトリとファイルを作成しました ---\n";
25    echo "ディレクトリ: " . realpath($sourceDirectory) . "\n";
26    echo "ファイル: file1.txt, data.json, subfolder/report.log\n\n";
27
28    // 2. PharData オブジェクトをインスタンス化します。
29    //    これは、tar や zip のような形式のアーカイブを扱うためのものです。
30    $phar = new PharData($archiveFileName);
31
32    // 3. buildFromDirectory メソッドを使って、指定ディレクトリの内容をアーカイブに追加します。
33    //    第二引数 $pattern を省略すると、ディレクトリ内の全てのファイルとサブディレクトリが追加されます。
34    //    例: $phar->buildFromDirectory($sourceDirectory, '/\.txt$/') とすると、.txt ファイルのみが追加されます。
35    echo "--- '" . $archiveFileName . "' アーカイブを作成中 ---\n";
36    $result = $phar->buildFromDirectory($sourceDirectory);
37
38    // 4. buildFromDirectory の結果を表示します。
39    //    戻り値は、アーカイブに追加されたファイルパスをキーとし、成功/失敗を bool 値で示す連想配列です。
40    echo "アーカイブ作成結果:\n";
41    foreach ($result as $fileInArchive => $success) {
42        if ($success) {
43            echo "  - " . $fileInArchive . " : 成功\n";
44        } else {
45            echo "  - " . $fileInArchive . " : 失敗 (Phar書き込み権限などを確認してください)\n";
46        }
47    }
48    echo "\n";
49
50    if (file_exists($archiveFileName)) {
51        echo "アーカイブファイル '" . $archiveFileName . "' が正常に作成されました。\n";
52        echo "ファイルサイズ: " . filesize($archiveFileName) . " バイト\n";
53    } else {
54        echo "エラー: アーカイブファイル '" . $archiveFileName . "' の作成に失敗しました。\n";
55    }
56
57} catch (Exception $e) {
58    // エラーが発生した場合の処理
59    echo "エラーが発生しました: " . $e->getMessage() . "\n";
60    if (strpos($e->getMessage(), 'write operations') !== false || strpos($e->getMessage(), 'readonly') !== false) {
61        echo "Pharの書き込みエラーです。php.ini の 'phar.readonly' 設定が '0' になっているか確認してください。\n";
62    }
63} finally {
64    // 5. クリーンアップ処理: 作成したファイルとディレクトリを削除します。
65    echo "\n--- クリーンアップ処理 ---\n";
66
67    // アーカイブファイルを削除
68    if (file_exists($archiveFileName)) {
69        unlink($archiveFileName);
70        echo "'" . $archiveFileName . "' を削除しました。\n";
71    }
72
73    // 作成したソースディレクトリとその中のファイルを削除
74    if (is_dir($sourceDirectory)) {
75        // サブディレクトリ内のファイルを削除
76        if (is_dir($sourceDirectory . '/subfolder')) {
77            array_map('unlink', glob($sourceDirectory . '/subfolder/*'));
78            rmdir($sourceDirectory . '/subfolder');
79        }
80        // ルートディレクトリ内のファイルを削除
81        array_map('unlink', glob($sourceDirectory . '/*'));
82        rmdir($sourceDirectory);
83        echo "'" . $sourceDirectory . "' ディレクトリを削除しました。\n";
84    }
85    echo "クリーンアップが完了しました。\n";
86}

PharData::buildFromDirectory メソッドは、PHPで特定のディレクトリ内のファイルをまとめてアーカイブファイル(例:.tar)として作成するために使用されます。このメソッドは、PharData クラスに属しており、主にファイルやディレクトリを配布・デプロイする際に役立ちます。

この機能を利用するには、PHPの設定ファイル(php.ini)で phar.readonly = 0 が設定されている必要があります。これは、セキュリティ上の理由からデフォルトで書き込みが無効になっている場合があるためです。

メソッドの第一引数 $directory には、アーカイブ化したいディレクトリのパスを指定します。第二引数 $pattern はオプションで、正規表現を使ってディレクトリ内の特定のファイルだけをアーカイブに含めることができます。この引数を省略した場合、指定されたディレクトリ内のすべてのファイルとサブディレクトリがアーカイブに追加されます。

buildFromDirectory メソッドの戻り値は、アーカイブに追加された各ファイルパスをキーとし、そのファイルの追加が成功したかどうかを真偽値で示す連想配列です。これにより、どのファイルがアーカイブに含まれたか、または処理に失敗したかをプログラムで確認できます。

提示されたサンプルコードでは、一時的なディレクトリとファイルを作成し、それらを使って .tar 形式のアーカイブを作成する一連の流れと、結果の確認、そして後片付けの方法が示されています。

PharData::buildFromDirectoryメソッドを利用する際、php.iniでphar.readonly = 0が設定されていることが必須です。これが1の場合、セキュリティ上の理由で書き込み操作が禁止され、エラーが発生しますのでご注意ください。第一引数にはアーカイブに含める対象ディレクトリのパスを渡し、第二引数(オプション)には含めるファイルを正規表現でフィルタリングできます。省略すると指定ディレクトリ内の全てのファイルとサブディレクトリが追加されます。メソッドの戻り値は、アーカイブに追加されたファイルパスをキーとし、成功したか失敗したかを示す真偽値の連想配列です。失敗時はphp.iniの設定やファイルシステムへの書き込み権限を確認してください。サンプルコードのような一時的なファイル作成では、必ず後処理でクリーンアップを行い、不要なファイルが残らないように管理することが重要です。

PHP PharDataでディレクトリをアーカイブする

1<?php
2
3// このスクリプトは、指定されたディレクトリの内容からデータアーカイブ (PharData) を作成する方法を示します。
4// これは、PHPアプリケーションを配布可能な単一のファイルにパッケージ化する「ビルドパック」の概念の一部として役立ちます。
5
6// 出力するアーカイブファイルのパス
7$archivePath = __DIR__ . '/application_package.tar.gz';
8// アーカイブに含めるソースディレクトリ
9$sourceDirectory = __DIR__ . '/source_app';
10
11// Phar 拡張が有効かチェック
12if (!extension_loaded('phar')) {
13    echo "エラー: Phar 拡張が有効になっていません。\n";
14    echo "php.ini で 'extension=phar.so' (または .dll) を有効にしてください。\n";
15    exit(1);
16}
17
18// 既存のアーカイブとソースディレクトリをクリーンアップするヘルパー関数を定義
19$cleanup = function (string $dir, string $archive) {
20    if (file_exists($archive)) {
21        unlink($archive);
22    }
23    if (is_dir($dir)) {
24        $deleteDir = function (string $target) use (&$deleteDir) {
25            $files = array_diff(scandir($target), ['.', '..']);
26            foreach ($files as $file) {
27                (is_dir("$target/$file")) ? $deleteDir("$target/$file") : unlink("$target/$file");
28            }
29            return rmdir($target);
30        };
31        $deleteDir($dir);
32    }
33};
34
35// クリーンアップを実行
36$cleanup($sourceDirectory, $archivePath);
37
38// サンプルアプリケーションのソースディレクトリとファイルを作成
39echo "サンプルソースディレクトリ '" . basename($sourceDirectory) . "' を作成中...\n";
40mkdir($sourceDirectory, 0755, true);
41file_put_contents($sourceDirectory . '/index.php', '<?php echo "Hello from packaged application!";');
42mkdir($sourceDirectory . '/config', 0755);
43file_put_contents($sourceDirectory . '/config/settings.php', '<?php return ["env" => "production"];');
44file_put_contents($sourceDirectory . '/README.md', '# My Application');
45file_put_contents($sourceDirectory . '/.env', 'APP_DEBUG=false'); // このファイルはパターンで除外されることを示す
46
47try {
48    echo "ディレクトリ '" . basename($sourceDirectory) . "' からアーカイブを構築中...\n";
49
50    // PharData オブジェクトをインスタンス化
51    // PharData はデータアーカイブ (tar, zip など) を扱うのに使用します。
52    // PHP アプリケーションの実行可能なアーカイブ (.phar) を作成する場合は Phar クラスを使用します。
53    $pharData = new PharData($archivePath);
54
55    // buildFromDirectory メソッドを使用して、指定されたディレクトリからファイルをアーカイブに追加します。
56    // 第2引数として正規表現パターンを指定することで、含めるファイルをフィルタリングできます。
57    // この例では、.php および .md ファイルのみを含めます。
58    $filesAdded = $pharData->buildFromDirectory($sourceDirectory, '/\.(php|md)$/');
59
60    // アーカイブの圧縮を適用します。
61    // .tar.gz ファイルを作成するためには、GZ (Gzip) 圧縮を適用します。
62    $pharData->compress(Phar::GZ);
63
64    echo "アーカイブが正常に構築されました: " . basename($archivePath) . "\n";
65    echo "含まれたファイル:\n";
66    foreach ($filesAdded as $file => $added) {
67        // buildFromDirectory は、追加されたすべてのファイルの相対パスをキーとして、
68        // 実際にファイルが追加されたか (bool) を値として持つ配列を返します。
69        // パターンマッチして追加されたファイルのみ表示します。
70        if ($added) {
71            echo "  - " . $file . "\n";
72        }
73    }
74    echo "アーカイブの場所: " . realpath($archivePath) . "\n";
75
76} catch (Exception $e) {
77    echo "アーカイブ構築中にエラーが発生しました: " . $e->getMessage() . "\n";
78    exit(1);
79} finally {
80    // クリーンアップ: 作成したサンプルソースディレクトリを削除
81    // アーカイブ自体は削除しないため、ここでは $sourceDirectory のみクリーンアップします。
82    echo "一時的なソースディレクトリ '" . basename($sourceDirectory) . "' を削除中...\n";
83    $cleanup($sourceDirectory, ''); // アーカイブパスは空文字列を渡して削除しない
84}
85

PharData::buildFromDirectoryメソッドは、PHPアプリケーションを単一のファイルにパッケージ化する「ビルドパック」のような用途で活用できる、データアーカイブ作成のための重要な機能です。このメソッドは、指定されたディレクトリ内のファイルとフォルダを、PharDataオブジェクトで表されるアーカイブに追加します。

最初の引数$directoryには、アーカイブに含めるソースディレクトリのパスを指定します。オプションの2番目の引数$patternには、正規表現を指定でき、これにより特定の拡張子のファイル(例:.phpや.mdファイル)のみをアーカイブに含めるようにフィルタリングできます。

メソッドの戻り値はarray<string, bool>型です。これは、アーカイブに追加が試みられたファイルそれぞれの、アーカイブ内での相対パスをキーとし、実際にファイルがアーカイブに追加されたかどうかを示す真偽値(trueまたはfalse)を値とする連想配列です。これにより、どのファイルがアーカイブに含まれたかを正確に確認できます。この機能は、PHPプロジェクトの配布やデプロイを効率化する上で非常に役立ちます。

PharData::buildFromDirectoryメソッドを利用する際は、まずPHPのPhar拡張がphp.iniで有効になっているか確認してください。PharDataクラスは.tar.gzのようなデータアーカイブの作成に特化しており、実行可能なPHPアプリケーションアーカイブ(.phar)を作成する際はPharクラスを用いる点に注意が必要です。buildFromDirectoryの第2引数$patternは正規表現で、含めるファイルを厳密にフィルタリングします。記述ミスは意図しないファイルの含入や除外の原因となるため、慎重に記述してください。戻り値は、アーカイブに追加されたファイルの相対パスとその成否を示す配列ですので、処理結果の確認に活用できます。ファイルシステムを操作するため、try-catchによるエラーハンドリングと、一時ファイルの適切なクリーンアップは安全な利用のために不可欠です。この機能は、アプリケーションを単一ファイルにまとめる「ビルドパック」に活用されます。

関連コンテンツ

関連IT用語

関連プログラミング言語