第一件事是:我的药是跑的。我在周围玩了一会儿,我有下面的场景:
我想把lib-phar放到应用程序-phar中。并且只需要应用程序-phar。这样,来自应用程序-phar的引导程序(存根)将从lib-phar加载引导带。
这是我想出的最好的介绍资源:http://www.slideboom.com/presentations/26182/PHP-5.3-Part-3---Introducing-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();
?>申请-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'));外存根
<?php
echo "outer stub loaded\n";
$inner_phar = 'phar://'.__FILE__.'/lib.phar';
require $inner_phar;
require 'phar://'.__FILE__.'/index.php';
__HALT_COMPILER();
?>main
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扩展不是为了这个而设计的。正如我们所看到的,第二个存根被调用,但是神奇的__FILE__常量(以及Phar::running(TRUE|FALSE) )在这里被设置错了。
你有什么想法吗?还是做了类似的设置?
当然,我知道其他的选择:
我真的很想考虑这个筑巢装置。也许你还有个好主意?
向飞利浦问好
发布于 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可以更容易地理解项目及其依赖项。
发布于 2012-11-24 12:46:29
短版本中,无法从其他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";}
https://stackoverflow.com/questions/7991708
复制相似问题