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

时间:2013-03-06 00:59:52

标签: php phar

我正在尝试将我的PHAR存档标记为PHP 我不知道此的正确术语),以便我可以在没有{的情况下从cli使用它{1}}部分。因此,我可以将其移至php并从任何地方调用php /path/to/my/archive.phar ARGUMENTS_HERE,而不是调用/usr/local/bin。 (就像PHPUnit或Composer一样)。

如果我是对的,那么我只需要在我的PHAR档案文件上添加archive吗?

我该怎么做?我尝试在构建脚本中模仿composer compiler,但只是崩溃了PHP_CLI(分段错误)

#!/usr/bin/env php

正如您所看到的,我只需要存根来运行$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; } 文件就可以了。

预编译PHAR

当然,我尝试的第一件事是手动将它预先添加到我的存档中,但看起来它会破坏它:

/lib/app.php

请注意,完全相同的存档在我手动修改之前有效。 (但当然需要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

2 个答案:

答案 0 :(得分: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并且这个有效?

答案 1 :(得分:0)

我需要做的就是更新这一行:

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

到:

cd = [[0.1,0.2,0.1,0.9], [0.2, 0.3, 0.4, 0.1],[0.2,0.3,0.1,0.5]

这将获取phar为您创建的默认存根,并添加需求#!排队。然后只需chmod 700生成的phar文件,你就可以了。