3

我可以在 PHP 中包含来自 zip 文件的文件吗?例如,考虑我有一个 zip 文件 - test.zip 和 test.zip 包含一个名为 a.php 的文件。现在,我想做的是如下所示,

包括“test.zip/a.php”;

这可能吗?如果是,谁能给我一个代码片段?如果没有,是否还有其他替代方法可以做到这一点?

4

2 回答 2

6
$zip = new ZipArchive('test.zip');

$tmp = tmpfile();
$metadata = stream_get_meta_data($tmp);

file_put_content($metadata['uri'], $zip->getFromName('a.php'));

include $metadata['uri'];

更进一步,您可能对PHAR存档感兴趣,它基本上是一个 Zip 存档。

编辑:

使用缓存策略:

if (apc_exists('test_zip_a_php')) {
    $content = apc_fetch('test_zip_a_php');
} else {
    $zip = new ZipArchive('test.zip');
    $content = $zip->getFromName('a.php');
    apc_add('test_zip_a_php', $content);
}

$f = fopen('php://memory', 'w+');
fwrite($f, $content);
rewind($f);
// Note to use such include you need  `allow_url_include` directive sets to `On`
include('data://text/plain,'.stream_get_contents($f));
于 2012-06-21T11:10:46.363 回答
2

大家确定吗?根据 phar 扩展,phar 是使用流包装器实现的,所以他们可以调用

include 'phar:///path/to/myphar.phar/file.php';

但也存在 zip 的流包装器,请参阅此示例,它们在其中调用:

$reader->open('zip://' . dirname(__FILE__) . '/test.odt#meta.xml');

在 zip 文件中打开文件 meta.xml test.odt(odt 文件只是具有另一个扩展名的 zip 文件)。

同样在另一个示例中,他们通过流包装器直接打开一个 zip 文件:

$im = imagecreatefromgif('zip://' . dirname(__FILE__) . '/test_im.zip#pear_item.gif');
imagepng($im, 'a.png');

我不得不承认,我不知道它是如何直接工作的。

我会尝试打电话

include 'zip:///path/to/myarchive.zip#file.php';

与 phar 包装不同,拉链包装接缝需要锋利,但您也可以尝试使用斜线。但这也只是阅读文档的一个想法。

如果它不起作用,你当然可以使用 phars。

于 2012-06-21T11:18:06.427 回答