重要的是:我的Phars运行。我稍微玩了一下,我有以下场景:
- 应用程序的Phar(没有异常)(application- Phar)
- 第二个phar,例如用于库。(lib-phar)
我想把库库放到应用程序库中。并且只需要应用程序。让application-phar中的引导程序(存根)从lib-phar中加载引导程序。
这是我想到的最好的介绍资源:http://www.slideboom.com/presentations/26182/php - 5.3 - 3 -引入phar一部分
我有以下内容:
lib-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'));
inner-stub
<?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();
?>
application-phar
$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'));
outer-stub
<?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)
)在这里设置错了。
你有什么想法吗?还是做了类似的设置?
我当然知道其他选择:
- 为lib + application使用一个stub和一个phar
- 解压lib。phar::load()
我真的很喜欢考虑这种嵌套设置。也许你还有别的好主意?
致以最亲切的问候菲利普
您使用phar的想法看起来很棒,并且也嵌套了它。而我看到了你解释的同样的问题。
在Java世界中,他们使用jar和war, jar用于库,而war用于应用程序,它包含所有的jar并在执行之前在web服务器上提取,最终lib文件夹包含所有的jar。
phar在PHP中是在Java的jar之后出现的,所以他们肯定应该尝试遵循类似的东西。
phar的目的是在其他应用程序中再次重用该phar,将其作为其他phar的一部分将使其他应用程序不容易对其进行评估。所以我更喜欢用phpmaven
使用phpmaven构建库项目并发布到maven服务器。使用phpmaven构建依赖于所有库项目的应用程序项目
你得到的构建与所有的库的phar,你甚至可以做一个单一的phar从它与一个建立解释你使用maven,这是更容易理解的项目和它的依赖。
简而言之,phar文件不能从其他phar文件中打开。必须首先将它们解压缩到phar:
之外的临时文件中。函数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";
}
也看到:如何将phar文件放入phar文件中?