【PHP実践|実務向け】PHP Archive (Phar) を活用したアプリケーションの配布と依存関係の管理

導入: Pharが解決する課題

PHP開発において、複数のファイルで構成されるライブラリやアプリケーションを配布する際、ファイル管理の煩雑さが課題となることはありませんか。特にクライアントへの納品物や、特定の環境へツールをデプロイする際、ディレクトリ単位でのコピーは漏れや不整合を引き起こすリスクがあります。
PHP Archive(以下、Phar)は、JavaのJARファイルのように、複数のPHPファイルを1つのアーカイブファイルに圧縮・パッケージングできる仕組みです。これにより、アプリケーションを「単一のファイル」として配布・実行可能になり、デプロイの簡素化とポータビリティを大幅に向上させることができます。

基礎知識: Pharとは何か

Pharは、PHP 5.3.0以降でコアに組み込まれた拡張モジュールです。Pharファイルは単なるアーカイブではなく、内部に「スタブ(Stub)」と呼ばれるPHPコードを含んでいます。このスタブが、アーカイブが実行された際に最初に読み込まれるエントリーポイントとして機能するため、Pharファイルを直接PHPコマンドで実行することが可能です。
また、Pharはライブラリとしてだけでなく、Webサーバから直接アクセスして実行させることも可能なため、小規模なツールや配布用パッケージの作成には非常に強力なツールとなります。

実装/解決策: Pharファイルの作成手順

Pharを作成するには、php.iniで「phar.readonly = Off」に設定する必要があります。作成の基本的な流れは以下の通りです。
1. Pharオブジェクトを作成する。
2. buildFromDirectoryを使用してディレクトリ内のファイルをパッケージングする。
3. スタブを設定し、実行可能にする。

サンプルプログラム: シンプルなPhar作成スクリプト

以下は、プロジェクトディレクトリ内のコードを「app.phar」という単一ファイルにまとめるためのビルド用スクリプトです。

buildFromDirectory(__DIR__ . ‘/src’);

// エントリーポイントとなるスタブを設定(実行時に読み込まれるメイン処理)
// ここでは src/main.php を実行するように指定
$defaultStub = $phar->createDefaultStub(‘main.php’);
$phar->setStub(“#!/usr/bin/env php\n” . $defaultStub);

echo “Pharファイルの生成が完了しました。” . PHP_EOL;
?>

応用・注意点: 現場で役立つアドバイス

1. セキュリティと署名:
Pharファイルは改ざん検知のために署名(OpenSSLなど)を付与できます。外部から実行される可能性があるツールを作成する場合は、必ず署名を行うことを推奨します。
2. readonly設定の罠:
本番環境のphp.iniで「phar.readonly = On」になっていると、実行時にPharの作成や変更が制限されます。本番サーバーでPharを動的に生成する必要がある場合は注意が必要です。
3. オートローダーの扱い:
Composerを使用している場合、スタブ内で「vendor/autoload.php」を適切にインクルードする必要があります。Phar内ではパスの解決が特殊になることがあるため、相対パスではなく、Pharの内部パス(phar://…)を意識した設計が肝要です。
4. デバッグの難しさ:
Pharに固めた後のコードは中身が直接見えにくいため、開発時は通常のファイル構成でテストを行い、デプロイ直前にパッケージングする運用フローを確立しましょう。

タイトルとURLをコピーしました