是否可以将phar放入phar?

时间:2011-11-03 07:59:04

标签: php php-5.3 phar

首先要做的事情是:我的Phars确实在运行。我正在玩一点,我有以下情况:

  • 应用程序的Phar(没有任何不规则的)(application-phar)
  • 第二个phar,例如图书馆。 (LIB-药业股份)

我想把lib-phar放到application-phar中。并且只需要应用程序。因此,application-phar的bootstrap(stub)从lib-phar加载bootstrap。

这是我提出的最佳介绍资源: http://www.slideboom.com/presentations/26182/PHP-5.3-Part-3---Introducing-PHAR

我有以下内容:

LIB-药业

$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)在这里设置错误。

你有什么想法吗?或者做了类似的设置?

当然我知道其他选择:

  • 对lib + application使用一个stub和一个phar
  • 将lib.phar解压缩到一个临时位置并从那里使用Phar :: load()

我真的很想考虑这种嵌套设置。也许你有另一个好主意?

祝你好运 菲利普

2 个答案:

答案 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";

}

另见: How to place a phar file inside a phar file?