首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有可能把一个phar变成一个phar?

是否有可能把一个phar变成一个phar?
EN

Stack Overflow用户
提问于 2011-11-03 07:59:04
回答 2查看 686关注 0票数 5

第一件事是:我的药是跑的。我在周围玩了一会儿,我有下面的场景:

  • 应用程序的Phar (与其无关)(应用程序-phar)
  • 第二个phar,例如用于库。(自由人民党)

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

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

我有以下几点:

利布-帕尔

代码语言:javascript
复制
$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'));

内存根

代码语言:javascript
复制
<?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();
?>

申请-phar

代码语言:javascript
复制
$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'));

外存根

代码语言:javascript
复制
<?php
echo "outer stub loaded\n";

$inner_phar = 'phar://'.__FILE__.'/lib.phar';
require $inner_phar;

require 'phar://'.__FILE__.'/index.php';
__HALT_COMPILER();
?>

main

代码语言:javascript
复制
php -f 'application.phar'

产出:

代码语言:javascript
复制
outer stub loaded

  inner stub loaded
  string(xx) "phar://full/path/to/application.phar"

outer index loaded

太久了,很好,但是.如何执行内部index.php?我想问题是,我想让一些令人困惑的事情:

代码语言:javascript
复制
 require 'phar://phar://full/path/to/application.phar/lib.phar';

以可读的形式::

代码语言:javascript
复制
 require 'phar://  
            phar://full/path/to/application.phar
          /lib.phar';

因为我的lib.phar在application.phar。所以我想我需要一个包装纸。所以也许PHAR扩展不是为了这个而设计的。正如我们所看到的,第二个存根被调用,但是神奇的__FILE__常量(以及Phar::running(TRUE|FALSE) )在这里被设置错了。

你有什么想法吗?还是做了类似的设置?

当然,我知道其他的选择:

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

我真的很想考虑这个筑巢装置。也许你还有个好主意?

向飞利浦问好

EN

回答 2

Stack Overflow用户

发布于 2012-04-17 00:47:37

您使用phar的想法看起来很棒,而且还可以嵌套它。而我看到你解释的同样的问题。

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

phar是在Java的jar之后在PHP中出现的,所以他们肯定应该尝试遵循类似的方法。

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

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

您可以使用所有的库phars获得构建,甚至可以使用onestub使用onestub生成单个phar,使用maven可以更容易地理解项目及其依赖项。

票数 1
EN

Stack Overflow用户

发布于 2012-11-24 12:46:29

短版本中,无法从其他phar文件中打开phar文件。必须首先将它们解压缩到phar之外的临时文件中:

函数extractAndLoadPhar(){

代码语言:javascript
复制
$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文件中?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7991708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档