php - 将 PHAR 存档标记为 PHP 可执行文件

标签 php phar

我正在尝试使我的 PHAR 存档标记为 PHP(我不知道这个的正确术语)以便我可以从 cli 中使用它而无需 php 部分。因此,与其调用 php/path/to/my/archive.phar ARGUMENTS_HERE,不如将其移动到 /usr/local/bin 并将其命名为 archive 从任何地方。 (就像 PHPUnit 或 Composer)。

如果我是对的,要做到这一点,我只需要在我的 PHAR 存档文件顶部添加 #!/usr/bin/env php 吗?

我该怎么做?我试着模仿 composer compiler在我的build 脚本中,但它只是使 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;
}

如您所见,我只需要 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)

最佳答案

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 崩溃而这个可以工作?

关于php - 将 PHAR 存档标记为 PHP 可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15237099/

相关文章:

javascript - 您应该如何将密码从纯 html/javascript 应用程序发送到 php 页面?

php - Codeigniter 使用 Controller 魔术方法 __call 进行路由行为

php - 是否可以将 phar 放入 phar 中?

php - 如何从 phar 文件安装 Laravel?

php - PHP PHAR 的意外问题

php - 如何正确创建然后需要 PHAR 文件?

php - 如何在像 xampp 这样的网络服务器上部署 phar 文件

php - 如何列出目录的所有内容?

php - 自动递增输入类型="hidden"值

php - 使用php字符串解析获取此字符串中的文件夹名称