首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在phar文件中放置phar文件?

如何在phar文件中放置phar文件?
EN

Stack Overflow用户
提问于 2012-11-01 23:36:05
回答 1查看 1.7K关注 0票数 13

我想把一个phar文件放在一个phar文件中。我尝试了最直接的方法:

代码语言:javascript
复制
$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就是不想打开它。它不接受以下任何内容:

代码语言:javascript
复制
// 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然而,可能我只是错过了一个如何做到这一点的方法,我只是没有看到树木的森林。

EN

回答 1

Stack Overflow用户

发布于 2012-11-24 08:51:15

你应该用来加载一个PHP文件的函数是Phar::loadPhar,例如

代码语言:javascript
复制
Phar::loadPhar("test2.phar", "test2");

将使phar文件test2.phar能够加载并可通过别名test2访问,因此您可以通过执行以下操作来包含其中的文件:

代码语言:javascript
复制
include ('phar://test2/index.php');

但是,如果该文件位于phar本身中,则这似乎不起作用。loadPhar的PHP代码是:

代码语言:javascript
复制
fp = php_stream_open_wrapper(fname, "rb", IGNORE_URL|STREAM_MUST_SEEK, &actual);

显然,IGNORE_URL标志使得文件不可能被打开。

有一个解决办法-将包含在另一个phar中的phar文件解压缩到一个临时文件中,然后它显然可以顺利加载。下面的代码将提取包含在第二个phar文件中的phar文件(phar1.phar),然后调用loadPhar。

代码语言:javascript
复制
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文件加载并运行了存根。

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

https://stackoverflow.com/questions/13180438

复制
相关文章

相似问题

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