PHP
Phar

ツールを使って簡単にPharを作成する

More than 1 year has passed since last update.

野暮用でPHPで書いたツールをPharにすることになりました。

pharというのはcomposer.pharとかのあれです。アプリを構成する複数のファイルを一つの実行可能なファイル(もちろん別途PHPを導入しておく必要はあります)にまとめることができるやつです。正確にはそれだけのものではありませんが、2016年においてそれ以外の用途も特に思いつかないのでそれでいいと思います(投げやり

で、PHP: Phar - Manual を読んでみたんですがまったく意味がわかりません。スタブってなんだよ!__HALT_COMPILER();とかなにそれ怖い……

でもまあ、こういう面倒なことにはなんらかツールが用意されているものだと探してみたらありました。Boxです。これを使えば簡単にPharを作成することができます。

PHP: Phar - Manual が理解できなくても大丈夫。そう、Boxならね。

まずはBoxをインストールしましょう。

$ curl -LSs https://box-project.github.io/box2/installer.php | php

成功するとカレントディレクトリにbox.pharというファイルが生成されるので、/usr/local/bin/boxにでもコピーして、パーミッションを755に変更します。これでboxコマンドが使えるようになりました。

さて、Phar化する対象のプロジェクトですが今どきだとだいたいこんな構成になっているかと思います。

.
├── composer.json
├── composer.lock
├── main.php
├── phpunit.xml
├── src/
├── tests/
└── vendor/
  • main.phpがコマンドのエントリポイント
  • srcにPSR0/PSR4でロードするphpファイル
  • testsにテスト関係のファイル
  • vendorにcomposerで導入したパッケージ

main.phpの内容としてはこんな感じ。

<?php
require_once __DIR__ . '/vendor/autoload.php';

$app = new Example\ConsoleApplication();
$app->run();

典型的ですね。

これをPhar化してみましょう。

まずはプロジェクトのトップディレクトリにbox.jsonを用意します。Boxのデフォルトのコンフィグファイルです。内容はこのようします。

{
    "directories": ["src", "vendor"],
    "main": "main.php",
    "output": "example.phar",
    "chmod": "0755",
    "stub": true
}
  • directoriesに指定したディレクトリ以下のphpファイルがアーカイブの対象になります
  • mainに指定したphpファイルがpharを実行したときに実行されます
  • outputは生成するpharファイル名です
  • 他はおまじない

とにかく、directoriesにアプリを動作させるのに必要なphpファイルの入ったディレクトリ、mainにエントリポイントとなるphpファイルを指定すればOKです。こんな大雑把な設定では無駄なファイル(例えば各パッケージのテスト関連のファイル)も沢山入ってしまうかもしれませんが動けばいいのだ!もちろん設定次第ではアーカイブ対象のファイルを事細かに指定することもできるので、気になる人はbox help buildを熟読しましょう。

box.jsonが用意できたらbox buildを実行します。

$ box build
Building...

これでexample.pharが生成されます。あとは、これをPATHの通ったディレクトリにコピーするなり、配布するなりお好きなように。

補足

PHPUnitなどrequire-devで入るパッケージはアプリの動作には必要ないので、pharの容量を削減するためにはできれば含めたくないところかもしれません。そんなときは、box buildを実行する前にcomposer install --no-devでパッケージをインストールし直しましょう。doctrine-migrationsのビルドスクリプトが参考になるかもしれません。box.jsonで個別にPHPUnitのパッケージをexcludeすることもできるかもしれませんがこちらのほうが簡単でしょう。