我正在尝试将我的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;
}
文件就可以了。
当然,我尝试的第一件事是手动将它预先添加到我的存档中,但看起来它会破坏它:
/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
)
答案 0 :(得分:0)
$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文件,你就可以了。