PHAR アーカイブを PHP としてマークして(これの正しい用語はわかりません)、一部なしで cli から使用できるようにしようとしていphp
ます。そのため、呼び出す代わりに、php /path/to/my/archive.phar ARGUMENTS_HERE
移動してどこからでも/usr/local/bin
呼び出すことができarchive
ます。(PHPUnit や Composer と同じように)。
私が正しければ、それを行うに#!/usr/bin/env php
は、PHAR アーカイブ ファイルの上に追加するだけでよいのでしょうか?
それ、どうやったら出来るの?ビルドスクリプトでcomposer コンパイラを模倣しようとしましたが、 PHP_CLI (セグメンテーション違反)がクラッシュするだけです。
$archiveName = 'phpbenchmark.phar';
$phar = new Phar($archiveName);
$phar->buildFromDirectory(__DIR__, '/\/lib\/|\/vendor\//');
$phar->setStub(createStub());
function createStub()
{
$stub = <<<EOD
#!/usr/bin/env php
<?php
Phar::mapPhar('phpbenchmark.phar');
require 'phar://phpbenchmark.phar/lib/app.php';
__HALT_COMPILER();
EOD;
return $stub;
}
ご覧のとおり、/lib/app.php
ファイルを実行するために必要なのはスタブだけで、それだけです。
コンパイルされた PHAR の先頭に追加
もちろん、私が最初に試したのは手動でアーカイブに追加することでしたが、それは破損しているようです:
PHP Fatal error: Uncaught exception 'PharException' with message 'manifest cannot be larger than 100 MB in phar "/home/igor/Dropbox/www/Github/PIFlexPHPBenchmark/phpbenchmark.phar"' in /home/igor/Dropbox/www/Github/PIFlexPHPBenchmark/phpbenchmark.phar:9
Stack trace:
#0 /home/igor/Dropbox/www/Github/PIFlexPHPBenchmark/phpbenchmark.phar(9): Phar::webPhar(NULL, 'index.php')
#1 {main}
thrown in /home/igor/Dropbox/www/Github/PIFlexPHPBenchmark/phpbenchmark.phar on line 9
Fatal error: Uncaught exception 'PharException' with message 'manifest cannot be larger than 100 MB in phar "/home/igor/Dropbox/www/Github/PIFlexPHPBenchmark/phpbenchmark.phar"' in /home/igor/Dropbox/www/Github/PIFlexPHPBenchmark/phpbenchmark.phar on line 9
PharException: manifest cannot be larger than 100 MB in phar "/home/igor/Dropbox/www/Github/PIFlexPHPBenchmark/phpbenchmark.phar" in /home/igor/Dropbox/www/Github/PIFlexPHPBenchmark/phpbenchmark.phar on line 9
Call Stack:
0.0010 306272 1. {main}() /home/igor/Dropbox/www/Github/PIFlexPHPBenchmark/phpbenchmark.phar:0
0.0011 307840 2. Phar::webPhar() /home/igor/Dropbox/www/Github/PIFlexPHPBenchmark/phpbenchmark.phar:9
手動で変更する前に、まったく同じアーカイブが機能することに注意してください。(ただしphp /path/to/arch
、もちろん必要です)