5

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

  • 应用程序的 Phar(没有什么不规则的)(application-phar)
  • 第二个 phar,例如用于图书馆。(lib-phar)

我想将 lib-phar 放入 application-phar。并且只需要应用程序phar。这样来自 application-phar 的引导程序(存根)从 lib-phar 加载引导程序。

这是我想出的最好的介绍资源: http ://www.slideboom.com/presentations/26182/PHP-5.3-Part-3---Introducing-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'));

内部存根

<?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();
?>

应用程序pha

$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 在 application.phar 中。所以我想我需要一个包装器周围的包装器。所以也许 PHAR-Extension 不是为此而设计的。正如我们所见,调用了第二个存根,但是魔术__FILE__常数(以及Phar::running(TRUE|FALSE)此处设置错误。

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

我当然知道替代方案:

  • 对 lib + 应用程序使用一个存根和一个 phar
  • 将 lib.phar 解压缩到一个临时位置,并使用 Phar::load() 从那里获取它

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

最好的问候菲利普

4

2 回答 2

1

您使用 phar 的想法看起来很棒并且也可以嵌套它。虽然我看到你解释了同样的问题。

在 Java 世界中,他们使用 jar 和 war,jar 用于库,而 war 用于应用程序,其中包含所有 jar 并在执行之前将其提取到 Web 服务器上,最终 lib 文件夹包含所有 jar。

phar 在 Java 的 jar 之后出现在 PHP 中,所以他们绝对应该尝试遵循类似的东西。

phar 的目的是在其他应用程序中再次重用该 phar,使其成为其他 phar 的一部分将使其不易被其他应用程序使用。所以我更喜欢使用phpmaven

使用 phpmaven 并构建库项目并发布到 maven 服务器。使用 phpmaven 并构建依赖于所有库项目的应用程序项目

您可以使用所有库 phas 进行构建,您甚至可以使用 onestub 从中制作单个 phar,正如您使用 maven 所解释的那样,这更容易理解项目及其依赖项。

于 2012-04-17T00:47:37.613 回答
0

Short version, phar files cannot be opened from within other phar files. They must first be extracted to a temporary file outside of the 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";

}

Also see: How to place a phar file inside a phar file?

于 2012-11-24T12:46:29.137 回答