有可能把一个瓶子放进另一个瓶子吗?


Is it possible to put a phar into a phar?

重要的是:我的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文件中?