【PHP8.x】Phar::buildFromDirectory()メソッドの使い方
buildFromDirectoryメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
buildFromDirectoryメソッドは、PHPアプリケーションやライブラリを単一のアーカイブファイル(Pharファイル)としてパッケージ化するために使用されるメソッドです。このメソッドは、指定されたディレクトリの内容を再帰的に走査し、その中に含まれるファイルやサブディレクトリをPharアーカイブに効率的に追加します。
第1引数には、アーカイブに含めたいファイルのルートとなるディレクトリのパスを指定します。このディレクトリ内のすべてのファイルとサブディレクトリは、その相対パスを保ったままアーカイブに追加されます。第2引数はオプションで、正規表現パターンを指定できます。このパターンを使用することで、アーカイブに含めるファイルを特定の条件でフィルタリングすることが可能です。例えば、.php拡張子を持つファイルだけを含めたり、テストファイルなどの特定のファイルをアーカイブから除外したりすることができます。
このメソッドを利用することで、複雑な構成を持つアプリケーションでも、すべての関連ファイルを一つの実行可能なPharファイルにまとめ上げることが可能になります。これにより、アプリケーションの配布、デプロイメント、管理が大幅に簡素化され、単一ファイルを転送するだけでアプリケーション全体を配置できるようになります。
構文(syntax)
1<?php 2 3// Pharアーカイブを新規作成または既存のものを開きます。 4$phar = new Phar('my_application.phar'); 5 6// 指定されたディレクトリ ('./source_files') から、 7// オプションとして正規表現 ('/\.php$/i' はPHPファイルにマッチ) に 8// 合致するファイルだけをPharアーカイブに追加します。 9$addedFiles = $phar->buildFromDirectory('./source_files', '/\.php$/i'); 10 11?>
引数(parameters)
string $directory, string $pattern = ''
- string $directory:pharアーカイブに含めるファイルが格納されているディレクトリへのパス
- string $pattern = '':pharアーカイブに含めるファイルの名前のパターン。デフォルトでは空文字列で、すべてのファイルが含まれます。
戻り値(return)
array
Phar::buildFromDirectory メソッドは、指定されたディレクトリから Phar アーカイブを構築する際に、アーカイブに追加されたファイルパスの配列を返します。
サンプルコード
Phar::buildFromDirectoryでディレクトリからPharを作成する
1<?php 2 3// このサンプルコードは、指定されたディレクトリの内容からPHPのPharアーカイブを作成する方法を示します。 4// Pharアーカイブは、複数のPHPファイルや関連アセットを一つの実行可能なファイルにまとめることができます。 5 6// !!! 重要 !!! 7// Pharアーカイブを作成するには、php.ini設定の 'phar.readonly' が '0' (オフ) に設定されている必要があります。 8// 開発環境では、ini_set() を使用して一時的にこの設定を変更できます。 9// 本番環境では、php.iniファイルを直接編集するか、サーバー管理者に依頼してください。 10ini_set('phar.readonly', 0); 11 12// 'phar.readonly' がまだ '1' の場合は、処理を中断します。 13if (ini_get('phar.readonly') == 1) { 14 echo "エラー: 'phar.readonly' が '1' に設定されているため、Pharアーカイブを作成できません。\n"; 15 echo "ini_set('phar.readonly', 0); が失敗したか、Phar機能が無効な環境です。スクリプトを終了します。\n"; 16 exit(1); 17} 18 19// 1. Pharアーカイブに含めるソースディレクトリとファイルの準備 20$sourceDirectory = __DIR__ . DIRECTORY_SEPARATOR . 'sample_app_source'; 21$pharFilePath = __DIR__ . DIRECTORY_SEPARATOR . 'my_application.phar'; 22 23// 一時的なソースディレクトリを作成 24if (!is_dir($sourceDirectory)) { 25 mkdir($sourceDirectory, 0777, true); // 0777は全権限、trueは再帰的作成を許可 26} 27 28// サンプルファイルを作成 29file_put_contents($sourceDirectory . DIRECTORY_SEPARATOR . 'index.php', '<?php echo "Hello from Phar application!";'); 30file_put_contents($sourceDirectory . DIRECTORY_SEPARATOR . 'config.php', '<?php return ["name" => "MyPharApp", "version" => "1.0"];'); 31file_put_contents($sourceDirectory . DIRECTORY_SEPARATOR . 'data.txt', 'This is some important data.'); 32 33echo "ソースディレクトリ '$sourceDirectory' を作成し、サンプルファイルを追加しました。\n"; 34 35try { 36 // 既存のPharファイルを削除(再実行時にエラーを防ぐため) 37 if (file_exists($pharFilePath)) { 38 Phar::unlink($pharFilePath); 39 echo "既存のPharアーカイブ '$pharFilePath' を削除しました。\n"; 40 } 41 42 // 2. Pharオブジェクトをインスタンス化 43 // 新しいPharアーカイブを作成するために、ファイルパスを指定します。 44 $phar = new Phar($pharFilePath); 45 46 // 3. buildFromDirectory() メソッドを使用して、指定されたディレクトリの内容をアーカイブに追加 47 // 第一引数 ($directory): アーカイブに含めるファイルの存在するディレクトリのパス。 48 // 第二引数 ($pattern, オプション): 含めるファイルをフィルタリングするための正規表現パターン。 49 // この例では、すべてのファイルを含めるため空文字列を指定しています。 50 // 例: '/\.php$/i' とすると、.phpファイルのみが追加されます。 51 $addedFiles = $phar->buildFromDirectory($sourceDirectory, ''); 52 53 echo "Pharアーカイブ '$pharFilePath' を作成しました。\n"; 54 echo "アーカイブに追加されたファイル:\n"; 55 foreach ($addedFiles as $filePath) { 56 // パスを整形して表示 (ソースディレクトリからの相対パス) 57 echo "- " . str_replace($sourceDirectory . DIRECTORY_SEPARATOR, '', $filePath) . "\n"; 58 } 59 60 // 4. Pharアーカイブの「スタブ」を設定 61 // スタブは、Pharファイルが直接実行されたときに最初に実行されるコードです。 62 // createDefaultStub() は、指定したファイルをアーカイブのエントリーポイントとするデフォルトのスタブを生成します。 63 $phar->setStub($phar->createDefaultStub('index.php')); 64 65 echo "Pharスタブを設定しました ('index.php' が実行時に開始されます)。\n"; 66 echo "Pharアーカイブが正常に作成されました。コマンドラインで 'php $pharFilePath' と実行してテストできます。\n"; 67 68} catch (PharException $e) { 69 // Phar関連のエラーが発生した場合の処理 70 echo "Pharアーカイブ作成中にエラーが発生しました: " . $e->getMessage() . "\n"; 71} finally { 72 // 5. クリーンアップ: 作成した一時ファイルとディレクトリを削除 73 // これはサンプルコードのために行われます。本番環境では、作成されたPharアーカイブは通常保持します。 74 if (file_exists($sourceDirectory . DIRECTORY_SEPARATOR . 'index.php')) { 75 unlink($sourceDirectory . DIRECTORY_SEPARATOR . 'index.php'); 76 } 77 if (file_exists($sourceDirectory . DIRECTORY_SEPARATOR . 'config.php')) { 78 unlink($sourceDirectory . DIRECTORY_SEPARATOR . 'config.php'); 79 } 80 if (file_exists($sourceDirectory . DIRECTORY_SEPARATOR . 'data.txt')) { 81 unlink($sourceDirectory . DIRECTORY_SEPARATOR . 'data.txt'); 82 } 83 if (is_dir($sourceDirectory)) { 84 rmdir($sourceDirectory); 85 } 86 87 echo "一時的なソースディレクトリとファイルをクリーンアップしました。\n"; 88} 89 90echo "Phar::buildFromDirectory() のサンプルコードの実行が完了しました。\n"; 91 92?>
PHPのPhar::buildFromDirectoryメソッドは、指定されたディレクトリ内のファイル群からPhar(PHP Archive)アーカイブを効率的に作成するための機能です。Pharアーカイブは、複数のPHPファイルや関連アセットを単一の実行可能なファイルにまとめることができ、アプリケーションの配布やデプロイを簡素化します。
このメソッドは、第一引数$directoryで指定されたパスのディレクトリからファイルを読み込み、それらをPharアーカイブに追加します。第二引数$patternはオプションで、正規表現の文字列を指定することで、ディレクトリ内のどのファイルをアーカイブに含めるかをフィルタリングできます。例えば、特定の拡張子を持つファイルのみを対象とするといった使い方が可能です。
メソッドが正常に実行されると、アーカイブに追加された全てのファイルの絶対パスを含む配列が戻り値として返されます。Pharアーカイブを作成する際には、PHPの設定ファイルphp.iniでphar.readonlyを0に設定する必要があります。これにより、スクリプトがPharアーカイブへの書き込みを許可されます。
サンプルコードでは、一時的なソースディレクトリを作成し、そこに複数のサンプルファイルを配置しています。その後、new Phar()で新しいPharアーカイブファイルを初期化し、buildFromDirectory()を用いてソースディレクトリの内容を一括でアーカイブに追加しています。最後に、アーカイブが実行された際に開始されるファイル(スタブ)を設定することで、単一のファイルとして実行可能なアプリケーションを構築する一連の流れが示されています。
Pharアーカイブを作成する際、まずphp.ini設定のphar.readonlyが0(オフ)になっていることを必ず確認してください。開発環境ではini_set()で一時的に変更できますが、本番環境ではセキュリティのため、ウェブサーバーからの作成を防止するために通常1(オン)に保つことが推奨されます。buildFromDirectoryメソッドの第二引数には正規表現パターンを指定でき、これによりアーカイブに含めるファイルを細かくフィルタリングできますので、不要なファイルを含めないように注意が必要です。また、アーカイブ作成後にはsetStub()メソッドで実行時のエントリーポイント(通常はindex.phpなど)を設定しないと、Pharファイルが単独で実行可能なアーカイブとして機能しません。エラーが発生した場合はPharExceptionを捕捉し、適切なエラーハンドリングを行うことが重要です。
Pharアーカイブをディレクトリからビルドする
1<?php 2 3// Phar拡張がロードされているか確認します。 4// Pharアーカイブの作成には、この拡張機能が必須です。 5if (!extension_loaded('phar')) { 6 echo "Error: The 'phar' extension is not loaded. Please enable it in your php.ini.\n"; 7 exit(1); 8} 9 10// Pharアーカイブに含めるアプリケーションのソースコードが置かれているディレクトリ名を定義します。 11$sourceDirectory = 'my_php_application_source'; 12 13// 生成するPharアーカイブのファイル名を定義します。 14// このファイルが、パッケージ化されたアプリケーションになります。 15$pharFileName = 'my_application.phar'; 16 17// サンプルコードを繰り返し実行しても問題ないように、 18// 既に存在するPharファイルとソースディレクトリがあれば削除します。 19if (file_exists($pharFileName)) { 20 unlink($pharFileName); 21} 22if (is_dir($sourceDirectory)) { 23 // ディレクトリ内のファイルを削除してからディレクトリを削除 24 array_map('unlink', glob("{$sourceDirectory}/*")); 25 rmdir($sourceDirectory); 26} 27 28// Pharアーカイブに含めるためのサンプルアプリケーションのディレクトリとファイルを作成します。 29// これらはPharアーカイブが作成されると削除されます。 30mkdir($sourceDirectory); 31file_put_contents($sourceDirectory . '/index.php', '<?php echo "Hello from your packaged PHP application!";'); 32file_put_contents($sourceDirectory . '/config.php', '<?php return ["app_name" => "MyPharApp", "version" => "1.0"];'); 33file_put_contents($sourceDirectory . '/README.md', 'This is a simple application packaged as a Phar archive.'); 34 35try { 36 // 新しいPharアーカイブを作成するためにPharオブジェクトをインスタンス化します。 37 // この操作により、指定されたファイル名でPharファイルが作成(または上書き)され、 38 // 書き込みモードで開かれます。 39 $phar = new Phar($pharFileName); 40 41 // Pharアーカイブが直接実行されたときのエントリポイント(起動スクリプト)を設定します。 42 // createDefaultStub()は、PharファイルをPHPインタープリタで実行した際に 43 // 指定されたファイルをロードするためのシンプルなPHPスクリプト(スタブ)を生成します。 44 $phar->setStub($phar->createDefaultStub('index.php')); 45 46 // buildFromDirectoryメソッドを使用して、指定されたディレクトリ内のファイルを 47 // Pharアーカイブに一括で追加します。 48 // 第1引数: ソースコードが置かれているディレクトリのパス。 49 // 第2引数 (オプション): 含めるファイルをフィルタリングするための正規表現パターン。 50 // この例では省略しているため、ディレクトリ内の全てのファイルが追加されます。 51 // 例: '/\.php$/' とすると、.php拡張子のファイルのみが追加されます。 52 $addedFiles = $phar->buildFromDirectory($sourceDirectory); 53 54 echo "Successfully created Phar archive: '{$pharFileName}'\n"; 55 echo "Added files to the archive:\n"; 56 foreach ($addedFiles as $filePath) { 57 // 返されるパスは絶対パスであるため、basenameでファイル名のみ表示します。 58 echo " - " . basename($filePath) . "\n"; 59 } 60 61 // Pharオブジェクトはスクリプト終了時、または他の操作で自動的に閉じられ、変更が保存されます。 62 63} catch (PharException $e) { 64 // Pharアーカイブの作成中にエラーが発生した場合の処理です。 65 echo "Error creating Phar archive: " . $e->getMessage() . "\n"; 66 exit(1); 67} finally { 68 // サンプルコードで作成した一時的なディレクトリとファイルをクリーンアップします。 69 // これにより、スクリプトを繰り返し実行してもファイルシステムが汚染されません。 70 if (file_exists($sourceDirectory . '/index.php')) { 71 unlink($sourceDirectory . '/index.php'); 72 } 73 if (file_exists($sourceDirectory . '/config.php')) { 74 unlink($sourceDirectory . '/config.php'); 75 } 76 if (file_exists($sourceDirectory . '/README.md')) { 77 unlink($sourceDirectory . '/README.md'); 78 } 79 if (is_dir($sourceDirectory)) { 80 rmdir($sourceDirectory); 81 } 82} 83 84// スクリプトの正常終了を示します。 85exit(0);
Phar::buildFromDirectoryは、PHPアプリケーションのソースコードや関連ファイルを一つの実行可能なアーカイブファイル(Pharファイル)にまとめてパッケージングする際に使用されるメソッドです。これにより、アプリケーションの配布やデプロイが非常に容易になります。
このメソッドは、指定されたディレクトリの内容をPharアーカイブに効率的に追加する役割を持ちます。第一引数$directoryには、アーカイブに含めたいアプリケーションのソースコードが置かれているディレクトリのパスを指定します。第二引数$patternはオプションで、正規表現パターンを指定することで、含めるファイルをさらに絞り込むことが可能です。例えば、.phpファイルのみを含めるといったフィルタリングができます。
メソッドが正常に実行されると、Pharアーカイブに追加された全てのファイルの絶対パスが配列として返されます。これにより、どのファイルがパッケージングされたかを確認できます。
サンプルコードでは、まずPharオブジェクトを初期化してmy_application.pharという名前のアーカイブファイルを作成し、index.phpをアプリケーションの起動スクリプトとして設定しています。その後、buildFromDirectoryメソッドを呼び出し、my_php_application_sourceディレクトリ内のファイルを全てmy_application.pharに一括で追加しています。このように、buildFromDirectoryを活用することで、複雑なPHPアプリケーションも手軽に単一ファイルとしてパッケージ化し、php buildpack環境などでの効率的なデプロイに役立てることができます。
Pharアーカイブを作成するには、PHPのphar拡張機能が有効になっているか必ず確認してください。無効の場合、php.iniで有効化が必要です。Phar::buildFromDirectoryメソッドは、指定したディレクトリ内の全てのファイルをデフォルトでPharアーカイブに追加します。そのため、開発用ファイルや機密情報など不要なファイルが含まれないよう、第2引数に正規表現パターンを指定して、含めるファイルを厳密にフィルタリングすることを強く推奨します。これにより、アーカイブのサイズを最適化し、セキュリティリスクを低減できます。また、Pharオブジェクトをインスタンス化する際にPharファイルが作成または上書きされるため、既存のファイルに注意が必要です。setStubでエントリポイントを設定しないと、Pharファイルが直接実行できない点も重要な注意点です。