我想把一个phar文件放在一个phar文件中。我尝试了最直接的方法:
$p = new Phar('test.phar', null, 'self.phar');
$p->setStub('<?php Phar::mapPhar();
include \'phar://self.phar/index.php\'; __HALT_COMPILER(); ?>');
$p['index.php'] = '<?php
echo "hello world\n";';
$p = new Phar('test2.phar', null, 'self.phar');
$p->setStub('<?php Phar::mapPhar();
include \'phar://self.phar/index.php\'; __HALT_COMPILER(); ?>');
$p['index.php'] = '<?php
echo "hello phar world\n";';
$p['test.phar'] = file_get_contents('test.phar');然而,PHP就是不想打开它。它不接受以下任何内容:
// Warning: Phar::mapPhar(phar://path/to/test2.phar/test.phar): failed to open
// stream: Invalid argument in phar://path/to/test2.phar/test.phar
include('phar://test2.phar/test.phar');
// Warning: include(phar://test2.phar/test.phar/index.php): failed to open
// stream: phar error: "test.phar/index.php" is not a file in phar "test2.phar"
include('phar://test2.phar/test.phar/index.php');
// Warning: include(phar://test2.phar/phar://test.phar/index.php): failed to
// open stream: phar error: "phar:/test.phar/index.php" is not a file in phar
// "test2.phar"
include('phar://test2.phar/phar://test.phar/index.php');我知道这个问题的建设性是有限的,因为它可能不适用于phar-in-phar然而,可能我只是错过了一个如何做到这一点的方法,我只是没有看到树木的森林。
发布于 2012-11-24 08:51:15
你应该用来加载一个PHP文件的函数是Phar::loadPhar,例如
Phar::loadPhar("test2.phar", "test2");将使phar文件test2.phar能够加载并可通过别名test2访问,因此您可以通过执行以下操作来包含其中的文件:
include ('phar://test2/index.php');但是,如果该文件位于phar本身中,则这似乎不起作用。loadPhar的PHP代码是:
fp = php_stream_open_wrapper(fname, "rb", IGNORE_URL|STREAM_MUST_SEEK, &actual);显然,IGNORE_URL标志使得文件不可能被打开。
有一个解决办法-将包含在另一个phar中的phar文件解压缩到一个临时文件中,然后它显然可以顺利加载。下面的代码将提取包含在第二个phar文件中的phar文件(phar1.phar),然后调用loadPhar。
function extractAndLoadPhar(){
$tempFilename = tempnam( sys_get_temp_dir() , "phar");
$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");
}
extractAndLoadPhar(); //Extract and load the phar
include ('phar://phar1/src1.php'); //It can now be referenced by 'phar1'我在这里的https://github.com/Danack/pharphar中放置了这段代码的工作副本,它创建了一个phar,将其嵌入到第二个phar中,然后在第二个phar中加载和调用第一个phar中的函数。
需要注意的是,我不相信这种技术是一个好主意。对于每个phar文件的存根文件发生了什么,似乎有一些模棱两可的地方(也就是我不明白)。也就是说,它们是都加载了,还是只有最外层的phar文件加载并运行了存根。
https://stackoverflow.com/questions/13180438
复制相似问题