【发布时间】:2013-02-20 15:20:13
【问题描述】:
我正在尝试将我的 PHAR 存档 标记为 PHP(我不知道这个的正确术语),这样我就可以在没有 @ 的情况下从 cli 使用它987654322@ 部分。因此,我可以将其移至/usr/local/bin 并从任何地方调用archive,而不是调用php /path/to/my/archive.phar ARGUMENTS_HERE。 (就像 PHPUnit 或 Composer)。
如果我是对的,那么我只需在我的 PHAR 存档文件顶部添加 #!/usr/bin/env php 即可?
我该怎么做?我试图在我的 build 脚本中模仿 composer compiler,但它只是 使 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)
【问题讨论】:
-
您不只是将
#!/usr/bin/env php添加到文件顶部,在开头的<?php标记和chmod文件上方作为可执行文件吗? -
我先尝试过,但它不起作用。我编辑了我的问题以提及这一点。