我想把lib-phar放到application-phar中。并且只需要应用程序。因此,application-phar的bootstrap(stub)从lib-phar加载bootstrap。
这是我提出的最佳介绍资源: http://www.slideboom.com/presentations/26182/PHP-5.3-Part-3---Introducing-PHAR
我有以下内容:
$innerPharFile = $this->newFile('lib.phar');
$innerPhar = new Phar((string) $innerPharFile);
$innerPhar->addFromString('index.php', '<?php echo " inner index loaded"; ?>');
$innerPhar->setStub(file_get_contents('inner_stub.php'));
<?php
echo " inner stub loaded\n\n";
// Here is the problem: how do i execute index.php from inner, here?
var_dump(Phar::running (TRUE));
echo "\n";
__HALT_COMPILER();
?>
$pharFile = $this->newFile('application.phar');
$phar = new Phar((string) $pharFile);
$phar->addFile($innerPharFile,'lib.phar');
$phar->addFromString('index.php', '<?php echo "outer index loaded"; ?>');
$phar->setStub(file_get_contents('outer-stub.php'));
<?php
echo "outer stub loaded\n";
$inner_phar = 'phar://'.__FILE__.'/lib.phar';
require $inner_phar;
require 'phar://'.__FILE__.'/index.php';
__HALT_COMPILER();
?>
php -f 'application.phar'
输出:
outer stub loaded
inner stub loaded
string(xx) "phar://full/path/to/application.phar"
outer index loaded
这么久,太好了,但...... 我如何执行内部index.php?我认为问题在于,我想让一些令人困惑的事情:
require 'phar://phar://full/path/to/application.phar/lib.phar';
以可读形式:
require 'phar://
phar://full/path/to/application.phar
/lib.phar';
因为我的lib.phar是IN application.phar。所以我想我需要一个包装器的包装器。
因此,可能没有为此制作PHAR-Extension。正如我们所看到的那样,第二个存根被调用,但魔术__FILE__
常量(以及Phar::running(TRUE|FALSE)
在这里设置错误。
你有什么想法吗?或者做了类似的设置?
当然我知道其他选择:
我真的很想考虑这种嵌套设置。也许你有另一个好主意?
祝你好运 菲利普
答案 0 :(得分:1)
您使用phar的想法看起来很棒并且也可以嵌套它。我看到你解释同样的问题。
在Java世界中,他们使用jar和war,jar用于库,而war用于应用程序,包含所有jar并在执行前在Web服务器上提取它,最后是包含所有jar的lib文件夹。
phar在使用Java的jar之后出现在PHP中,所以他们肯定会尝试遵循类似的东西。
phar的目的是在某些其他应用程序中再次重用该phar,使其成为其他phar的一部分将使其不易被其他应用程序所接受。所以我更喜欢使用phpmaven
使用phpmaven和构建库项目并发布到maven服务器。 使用phpmaven并依赖于所有库项目构建应用程序项目
你得到了所有库phars的构建,你甚至可以用onestub制作一个phar,正如你使用maven所解释的那样,更容易理解项目及其依赖。
答案 1 :(得分:0)
短版本,无法从其他phar文件中打开phar文件。首先必须将它们提取到phar之外的临时文件中:
function extractAndLoadPhar(){
$tempFilename = tempnam( sys_get_temp_dir() , "phar");
//$tempFilename = "/tmp/phar1.phar";
//echo "tempFilename is $tempFilename\r\n";
$readHandle = fopen("phar://phar2/phar1.phar", "r");
$writeHandle = fopen($tempFilename, "w");
while (!feof($readHandle)) {
$result = fread($readHandle, 512);
fwrite($writeHandle, $result);
}
fclose($readHandle);
fclose($writeHandle);
$result = Phar::loadPhar($tempFilename, "phar1");
//echo "Load result is $result \r\n";
}