導入
PHPでの開発において、複数のPHPファイルやライブラリ、リソースファイルをひとつのファイルにまとめて配布・実行したいと考えたことはありませんか?JavaのJARファイルに近い概念として、PHPには「phar(PHP Archive)」というアーカイブ形式が存在します。pharを活用することで、アプリケーションの配布が容易になるだけでなく、プロジェクトのポータビリティが劇的に向上します。本記事では、このpharの仕組みと、実務で役立つ作成手順を解説します。
基礎知識
pharとは、PHPのアプリケーションを単一のファイルにパッケージングするためのアーカイブ形式です。最大の特徴は、PHPのインタプリタがpharファイルを直接実行可能である点です。内部にはPHPのソースコードだけでなく、画像や設定ファイルなどのリソースも封入できます。
実務においては、ツール類の配布や、プラグインシステムのパッケージング、さらには依存関係を含むライブラリの配布に利用されます。
実装/解決策
pharを作成するには、php.iniで「phar.readonly」の設定が「Off」になっている必要があります。開発環境で確認し、必要に応じて設定を変更してください。作成プロセスは主に「Pharクラスのインスタンス化」「ディレクトリの追加」「スタブ(実行時に最初に読み込まれるコード)の設定」の3ステップで行います。
サンプルプログラム
以下のコードは、指定したディレクトリ内のファイルを「app.phar」という単一ファイルに圧縮し、実行可能な形式にするサンプルです。
buildFromDirectory($srcRoot);
// スタブ(エントリポイント)の設定
// このファイルが実行された時に、どのファイルが最初に読み込まれるかを指定します
$defaultStub = $phar->createDefaultStub(‘index.php’);
$phar->setStub(“#!/usr/bin/env php\n” . $defaultStub);
echo “pharファイルの作成が完了しました: ” . $pharFile;
// 実行方法: php app.phar
?>
応用・注意点
1. セキュリティと署名: 実務で配布を行う際は、署名(Signature)を付与することをお勧めします。$phar->setSignatureAlgorithm(Phar::SHA256); を使用することで、ファイルの改ざん検知が可能になります。
2. キャッシュの問題: pharはデフォルトでキャッシュ機能が働くため、開発中に中身を更新しても古い内容が参照されることがあります。開発中は「Phar::interceptFileFuncs()」の挙動や、php.iniでのキャッシュ設定に注意してください。
3. readonly制限: 本番環境のサーバーではセキュリティ上の理由から「phar.readonly = On」が推奨されます。そのため、デプロイ後のphar作成は避け、CI/CDパイプライン内で事前に作成・配布するフローを構築するのがベストプラクティスです。
pharを使いこなすことで、配布物の管理が非常にシンプルになります。ぜひ、自作のCLIツールやモジュール配布にご活用ください。