3

我正在尝试将我的 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当然需要)

4

2 回答 2

0

Aaaand,在打破我的头几个小时后解决了(有点)。我仍然不知道为什么,这个构建脚本似乎工作:

$archiveName = 'phpbenchmark.phar';

$phar = new Phar($archiveName);

$phar->buildFromDirectory(__DIR__, '/\/lib\/|\/vendor\//');

$phar->setStub(createStub());

function createStub()
{
    $stub = <<<ENDSTUB
#!/usr/bin/env php
<?php
Phar::mapPhar('phpbenchmark.phar');
require 'phar://phpbenchmark.phar/lib/app.php';
__HALT_COMPILER();
ENDSTUB;

    return $stub;
}

除了.....我真的看不出与我的问题中发布的原始脚本有任何区别?为什么原来的一个 PHP Cli 会崩溃而这个工作?

于 2013-03-06T01:45:16.633 回答
0

我需要做的就是更新该行:

$phar->setStub($phar->createDefaultStub("main.php"));

到 :

$phar->setStub("#!/usr/bin/env php\n\n" . $phar->createDefaultStub("main.php"));

这将采用 phar 为您创建的默认存根,并添加 requires #! 线到它。然后只需 chmod 700 生成的 phar 文件,你就可以开始了。

于 2015-10-14T16:37:45.113 回答