【问题标题】:Marking PHAR archive as PHP executable将 PHAR 存档标记为 PHP 可执行文件
【发布时间】: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 添加到文件顶部,在开头的&lt;?php 标记和chmod 文件上方作为可执行文件吗?
  • 我先尝试过,但它不起作用。我编辑了我的问题以提及这一点。

标签: php phar


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    到:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-02
      • 2019-12-18
      相关资源
      最近更新 更多