1. 導入:なぜPHARが重要なのか
PHPで開発したアプリケーションやツールを配布する際、複数のファイルをバラバラに管理するのは面倒ですし、インストール時の環境構築でトラブルが起きがちです。そんな課題を解決するのがPHAR(PHP Archive)です。
PHARはJavaのJARファイルに近い概念で、複数のPHPファイルやリソースを一つのアーカイブファイルにまとめ、PHPインタプリタがあればどこでも実行可能にします。配布の手間を減らし、ライブラリのバージョン管理を容易にするために、熟練エンジニアなら押さえておくべき技術です。
2. 基礎知識:PHARの仕組み
PHARは、単なるアーカイブではなく、PHP実行環境が直接読み込んで実行できる「実行可能ファイル」として機能します。
重要なポイント:
・phar.readonly設定: php.iniでデフォルトが「On(読み取り専用)」になっていることが多いため、書き出しを行う際は一時的に変更する必要があります。
・スタブ(Stub): PHARファイルの先頭にあるPHPコードで、アーカイブが実行された際に最初に読み込まれるエントリーポイントです。
・圧縮: GzipやBzip2など、必要に応じてアーカイブを圧縮してサイズを軽量化できます。
3. 実装/解決策:PHAR作成のステップ
PHARを作成するには、PHP標準のPharクラスを使用します。基本的な流れは以下の通りです。
1. 新しいPharインスタンスを生成する。
2. ディレクトリ全体を再帰的に追加する。
3. エントリーポイントとなる「スタブ」を設定する。
4. 実行権限を与える。
4. サンプルプログラム:PHAR作成スクリプト
以下のコードは、指定したディレクトリ内のファイルを「app.phar」としてパッケージ化する実用的なスクリプトです。
buildFromDirectory(dirname(__FILE__) . ‘/src’);
// エントリーポイント(スタブ)の設定
// このファイルが実行された時に最初に呼ばれる処理を記述
$defaultStub = $phar->createDefaultStub(‘index.php’);
$phar->setStub(“#!/usr/bin/env php\n” . $defaultStub);
echo “PHARファイルを作成しました: ” . $pharFile . PHP_EOL;
// chmodで実行権限を付与
chmod($pharFile, 0755);
?>
作成したファイルは、ターミナルで「php app.phar」や、実行権限があれば「./app.phar」として実行可能です。
5. 応用・注意点:現場での運用Tips
・依存関係の管理:
Composerを使っている場合、vendorディレクトリごとPHARに含めることも可能です。ただし、ファイルサイズが肥大化しやすいため、必要なファイルのみを選別する設計を心がけてください。
・セキュリティリスク:
PHARは任意のPHPコードを実行できるため、外部からアップロードされたPHARファイルをそのまま実行するのは非常に危険です。信頼できるソースからのみ読み込むようにし、署名(Phar::setSignatureAlgorithm)を活用して改ざん検知を行うのがベストプラクティスです。
・デバッグのしやすさ:
PHAR化するとソースが見えにくくなります。本番環境へのデプロイには便利ですが、開発中やローカル環境ではシンボリックリンク等を使って、素のソースコードを読み込むように切り替えられる構成にしておくと、デバッグが格段に楽になります。