我正在尝试将我的 PHAR 存档标记为 PHP(我不知道正确的术语),以便我可以从 cli 中使用它而无需任何php
部分。因此,php /path/to/my/archive.phar ARGUMENTS_HERE
我可以将它移到/usr/local/bin
并从任何地方调用它,而不是打电话archive
。(就像 PHPUnit 或 Composer 一样)。
如果我是对的,要做到这一点,我只需要#!/usr/bin/env php
在我的 PHAR 存档文件之上添加?
我怎么做?我试图在我的构建脚本中模仿作曲家编译器,但它只是使 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
当然需要)