導入
PHPで開発したアプリケーションを配布する際、大量のソースファイルをそのまま納品・設置するのは管理が煩雑になりがちです。特にライブラリやコマンドラインツールを配布する場合、複数のファイルを一つの実行可能ファイルにまとめたいというニーズが発生します。そんな課題を解決してくれるのが、PHPの標準機能である「PHAR(PHP Archive)」です。
基礎知識
PHARとは、JavaのJARファイルのような仕組みで、複数のPHPファイルや関連リソースを1つのアーカイブファイルにまとめるための技術です。PHP 5.3.0以降で標準搭載されており、これを使うことで、アプリケーションを単一のファイルとして配布し、実行することができます。また、PHARファイルはPHPエンジンによって直接実行可能な形式にできるため、デプロイや配布が極めて容易になります。
実装/解決策
PHARを作成するには、PHPの`Phar`クラスを使用します。作業手順は以下の通りです。
1. php.iniで `phar.readonly` を `Off` に設定します(作成時のみ必要)。
2. `Phar` インスタンスを作成し、アーカイブ対象のディレクトリやファイルを追加します。
3. `setStub` メソッドを使用して、ファイル実行時に呼び出されるエントリーポイント(メイン処理)を設定します。
サンプルプログラム
以下は、特定のディレクトリ内のファイルを一つの「app.phar」にまとめるスクリプト例です。
buildFromDirectory(dirname(__FILE__) . ‘/src’);
// エントリーポイントの設定(実行時に呼び出されるファイル)
$defaultStub = $phar->createDefaultStub(‘index.php’);
// スタブ(起動スクリプト)の設定
$phar->setStub(“#!/usr/bin/env php\n” . $defaultStub);
echo “PHARファイルを作成しました: ” . $pharFile . PHP_EOL;
?>
このスクリプトを実行すると、`src`ディレクトリ内のコードが`app.phar`に圧縮され、`php app.phar`コマンドで直接起動できるようになります。
応用・注意点
現場でPHARを利用する際の注意点は、書き込み権限です。PHAR自体はアーカイブ形式であるため、内部のファイルを直接書き換える運用には向きません。設定ファイルやログファイルなど、実行中に書き込みが発生するデータは、PHARの外(外部ディレクトリ)に配置し、読み書きする設計にするのが定石です。
また、PHARファイルはセキュリティ上のリスクにもなり得ます。サーバー環境で`phar.readonly`が`On`(デフォルト)になっている場合、PHARの作成はできませんが、配布されたPHARを実行する分には問題ありません。本番環境へのデプロイ前には、必ずPHAR化した状態での動作テストを行い、パスの参照関係が崩れていないか確認するようにしてください。