
Phar
はJavaの世界の
jar
の類似物ですが、PHPにのみ関連しています。
Phar
は、プロジェクトファイルを特別なアーカイブにパックし、プロジェクト自体を実行可能プログラムとして操作することなく、アプリケーションの転送とインストールを簡単にします。
公式ドキュメントからのpharの説明
Pharアーカイブは、複数のファイルを1つのファイルにグループ化する便利な方法として最もよく特徴付けられます。 そのため、pharアーカイブは、完全なPHPアプリケーションを単一のファイルで配布し、ディスクに抽出することなくそのファイルから実行する方法を提供します。 さらに、pharアーカイブは、コマンドラインとWebサーバーの両方で、他のファイルと同じくらい簡単にPHPで実行できます。 Pharは、PHPアプリケーションのサムドライブのようなものです。
PHPでpharファイルを作成するには、 かなり分岐したAPIがありますが、よりシンプルで便利な方法があります-Boxプロジェクトを使用します。
JSONファイル形式
Boxプロジェクトを使用すると、便利なJSON形式でpharファイルを作成するプロセスを説明できます。
最も単純なファイルは次のようになります。
{ "files": ["src/Put.php"], "main": "bin/main", "output": "example.phar", "stub": true }
どこで
files
-pharに含まれるファイル
main
-pharファイルが呼び出されたときに実行されるファイル
phar
結果の
phar
ファイルの名前
stub
-コンソールアプリケーションが
true
設定されている
true
ここでは、単純なプロジェクトの例を使用して、pharファイルを作成するプロセスを見ることができます。
これは、コメント付きのすべての可能な
box.json
オプションのリストです。
実際のプロジェクトの例を使用して、pharファイルをビルドしてみましょう。 例として、 Nasgrateデータベース移行システムを取り上げます 。 「従来」、このシステムは、GitHubからリポジトリを複製するか、Composerを介してインストールされます。 PHPに関する知識がまったくなくても、単純にダウンロードして使用を開始できる別のユーティリティを作成しようとします。
プロジェクトのルートに
box.json
を作成します
{ "chmod": "0755", "directories": ["src","app"], "files": ["README.md"], "main": "bin/nasgrate", "output": "nasgrate.phar", "stub": true }
directories
-このパラメータには、プロジェクトに完全に含まれるディレクトリのリストが含まれます(この場合は、
src
および
app
ディレクトリ)。
files
-特定のファイルを含める必要がある場合は、ここにリストします。
たとえば、box.jsonを次のように書き換えることができます。
{ "chmod": "0755", "directories": ["src"], "files": ["app/console.php", "app/index.php", "README.md"], "main": "bin/nasgrate", "output": "nasgrate.phar", "stub": true }
これら2つの記録オプションに加えて、フィルターに基づいてプロジェクトにファイルを選択的に含めることもできます。 たとえば、プロジェクトで外部ライブラリがアクティブに使用され、それらが
vendors
フォルダにある場合、これらのライブラリのファイルをプロジェクトに含めますが、たとえば、すべてのテストを除外します。 ファイルは次のようになります
{ "chmod": "0755", "directories": ["src"], "files": ["app/console.php", "app/index.php", "README.md"], "finder": [ { "name": "*.php", "exclude": [ "tests", "test" ], "in": "vendor" } ], "main": "bin/nasgrate", "output": "nasgrate.phar", "stub": true }
この場合の
finder
セクションには、「
tests
および
test
フォルダーを除く
vendor
ディレクトリからの
*.php
拡張子を持つすべてのファイルを含める」とあります。
chmod
-
phar
ファイルにパーミッションを設定できます。 この場合、ファイルを実行可能にするために
0755
を設定します。
残りのパラメーターは上記のとおりです。
ボックスのインストール
最も簡単な(推奨される)インストール方法
$ curl -LSs https://box-project.github.io/box2/installer.php | php
その後、
box.phar
が現在のディレクトリに表示されます。
php box.phar
として実行するか、
chmod 755 box.phar
を実行する権限を割り当て、box
mv box.phar box
に名前を変更して
/usr/local/bin
転送し
mv box.phar box
。 次に、
box
ようにどこからでも起動でき
box
。
Composerによる代替インストール
$ composer global require kherge/box --prefer-source
または既存のプロジェクトに追加します
{ "require-dev": { "kherge/box": "~2.5" } }
インストールを確認する
$ box -v
プログラムの説明と可能なオプションのリストを表示する必要があります。
次に、
php.ini
ファイルで
phar.readonly
パラメーターが
0
、
Off
または
false
phar.readonly
ていることを確認する必要があり
false
。
コンソールに関連するファイルの場所を確認します(phpinfo()を実行すると、Apacheを介して別のphp.iniが表示されます)。
$ php -i | grep php.ini >> Configuration File (php.ini) Path => /usr/local/php5/lib >> Loaded Configuration File => /usr/local/php5/lib/php.ini
次に、
phar.readonly
パラメーターを見つけて
Off
設定し
Off
。
[Phar] ; http://php.net/phar.readonly phar.readonly = Off
プロジェクトのコンパイル
プロジェクトフォルダー(
box.json
するレベル)に移動し、コンパイルを開始します
$ box build -v
-v
フラグを使用すると、コンパイル中に何が起こるかを確認できます
Removing previously built Phar... * Building... ? Output path: /Users/dlevsha/Sites/nasgrate/nasgrate.phar ? Adding directories... + /Users/dlevsha/Sites/nasgrate/src/config.php + /Users/dlevsha/Sites/nasgrate/src/Driver/Base/Dump.php + /Users/dlevsha/Sites/nasgrate/src/Driver/Base/Generator.php + /Users/dlevsha/Sites/nasgrate/src/Driver/Base/Helper.php + /Users/dlevsha/Sites/nasgrate/src/Driver/Base/Migration.php + /Users/dlevsha/Sites/nasgrate/src/Driver/Mysql/Dump.php + /Users/dlevsha/Sites/nasgrate/src/Driver/Mysql/Generator.php + /Users/dlevsha/Sites/nasgrate/src/Driver/Mysql/Helper.php + /Users/dlevsha/Sites/nasgrate/src/Process/Base.php + /Users/dlevsha/Sites/nasgrate/src/Process/Console.php + /Users/dlevsha/Sites/nasgrate/src/Process/Server.php + /Users/dlevsha/Sites/nasgrate/src/template.sql + /Users/dlevsha/Sites/nasgrate/src/Util/Console.php + /Users/dlevsha/Sites/nasgrate/src/Util/Db.php + /Users/dlevsha/Sites/nasgrate/app/console.php + /Users/dlevsha/Sites/nasgrate/app/index.php ? Adding files... + /Users/dlevsha/Sites/nasgrate/README.md ? Adding main file: /Users/dlevsha/Sites/nasgrate/bin/nasgrate ? Generating new stub... ? Setting file permissions... * Done.
その後、
nasgrate.phar
ファイルがプロジェクトディレクトリに表示されます。
すべてが正常にコンパイルされたことを確認します。
$ ./nasgrate.phar
ユーティリティの説明が表示されます
Nasgrate is a console utility that let you organise database schema migration process at a consistent and easy way. It supports mysql, mssql, postgresql, oracle and other databases Usage: php nasgrate [command] [options] Command: status - displays migration status generate - creates new migration (migration file) up:show - displays (but not executes) SQL-query, executed by migration update ...
外部リソースを操作する
phar
の機能は、アーカイブ内のすべてのリソースを検索することです。 ほとんどの場合、これは問題ではありません。環境から独立させるのはこのためであるためです。 しかし、
phar
アーカイブ内のリソースが外部ファイルを操作する必要がある場合がいくつかあります。
たとえば、Nasgrate-
.environment
ファイルから設定を読み取り、移行ファイルとステータスファイルを外部ディレクトリに書き込む必要があります。
../.environment
ように、プロジェクト内で相対パスを指定しようとすると、
phar
内にそのようなファイルがないため、エラーが生成されます。
この問題を解決するための2つのオプションがあります。
最初のオプションは、外部ファイルを
phar
ファイルの内部スペースにマップすることです。
Phar::mount('phar://.environment', '/etc/nasgrate/.environment');
問題は、ファイルへの絶対パスを正確に知る必要があることです。
2番目のオプションは、
phar
ファイルの現在の場所からのパスを指定することです。 このようなもの:
define(DIR_RUN, dirname(Phar::running(false)));
次に、Phar :: mountを使用して内部の
phar
スペースにマッピングするか、単に構成ファイルへの絶対パスを指定します。 構成ファイルは
phar
自体と同じフォルダーにあると仮定します
define(DIR_RUN, dirname(Phar::running(false))); Phar::mount('phar://.environment', DIR_RUN.'/.environment');
その後、ローカルファイルとして参照するか、常に絶対パスを参照します。
これがバグなのか機能なのかはわかりませんが、
Phar::mount
を介して接続されているすべてのディレクトリは読み取り専用モードであり、これを変更する方法はあまり明確ではありません。 絶対パスに対処する場合、このような問題は発生しません。
もう1つは明らかな点のように思えますが、注意する価値があります。 pharファイルにはプロジェクトのリソースが含まれており、PHP自体、そのバージョンなどに接続されたライブラリの存在を規制しません。 つまり、PDOなどの何らかのPHP拡張機能を使用したり、PECLから何かをインストールしたり、PHPの特定のバージョンの機能を使用したりすると、pharにはランタイムに関する情報が含まれません。 たとえば、PHP 5.4の特性を使用し、ユーザーが5.3を持っている場合、エラーが生成されます。 アプリケーション内で必要な依存関係をすべて確認する必要があります。
関連リンク: