導入
開発したPHPアプリケーションをサーバーへデプロイする際、数百〜数千のファイルを手動でアップロードしていませんか?ファイル数が多くなると、転送の失敗やパーミッションの不整合、一部ファイルの更新漏れといったリスクが高まります。
そこで活用したいのが「PHAR (PHP Archive)」です。これは、JavaのJARファイルのように、複数のPHPファイルやリソースを1つのファイルにパッケージングできる仕組みです。本記事では、PHARの基礎知識から、実務で役立つ作成・実行方法を解説します。
基礎知識
PHARは「PHP Archive」の略で、PHP 5.3以降で標準サポートされているアーカイブ形式です。
PHARの主なメリットは以下の通りです。
・デプロイの簡素化:単一ファイルになるため、FTPやSCPでの転送が極めて高速かつ安全になります。
・配布の容易さ:ライブラリやツールを単一ファイルとして配布でき、利用者はincludeするだけで即座に利用可能です。
・パフォーマンス:ファイルをまとめることで、サーバー上のディスクI/Oを削減できる可能性があります。
実装/解決策
PHARを作成するには、PHPの Pharクラス を使用します。基本的には「ディレクトリ内のファイルを指定して圧縮し、スタブ(エントリポイントとなる実行コード)を設定する」という手順を踏みます。
実務では、ビルドスクリプト(build.phpなど)を作成し、CI/CDパイプラインに組み込むことで、自動的にデプロイ用のPHARファイルを生成するのが一般的です。
サンプルプログラム
以下は、プロジェクトディレクトリ内のファイルを「app.phar」というファイルにまとめるためのビルドスクリプト例です。
buildFromDirectory(dirname(__FILE__) . ‘/src’);
// エントリポイントの設定(PHARが実行された際に最初に読み込まれるファイル)
$defaultStub = $phar->createDefaultStub(‘index.php’);
// スタブの設定(CLI実行時に利用可能にする)
$phar->setStub(“#!/usr/bin/env php\n” . $defaultStub);
echo “PHARファイルの作成が完了しました: ” . $pharFile . PHP_EOL;
?>
このスクリプトを実行後、生成されたファイルを `php app.phar` と叩くことでアプリケーションを起動できます。
応用・注意点
1. php.iniの設定:PHARを作成するには、`php.ini` で `phar.readonly` が `Off` になっている必要があります。本番環境ではセキュリティのため `On` にすることを推奨します。
2. 署名機能の活用:PHARはOpenSSL等を用いた署名が可能です。配布するライブラリであれば、改ざん検知のために署名を付与する実装を行いましょう。
3. キャッシュの問題:PHAR内のファイルを更新した場合、PHPのオペコードキャッシュ(OPcache)が古い内容を保持していることがあります。デプロイ時には必要に応じてキャッシュのクリア(`opcache_reset()`)を検討してください。
4. 巨大なファイルサイズ:あまりに巨大なPHARファイルを作成すると、メモリ消費が激しくなる場合があります。大規模なアプリケーションでは、必要なライブラリだけをComposerで管理し、PHARは実行ツールとして切り出す構成がベストプラクティスです。