我可以在PHP中包含zip文件吗?

时间:2012-06-21 11:07:11

标签: php

我可以在PHP中包含zip文件中的文件吗?例如,我认为我有一个zip文件 - test.zip和test.zip包含一个名为a.php的文件。现在,我想做的是下面的事情,

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

这可能吗?如果可以,任何人都可以提供我的代码片段?如果没有,还有其他任何替代方法吗?

2 个答案:

答案 0 :(得分: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));

答案 1 :(得分:2)

你们都确定吗?根据phar扩展,phar使用流包装器实现,因此他们可以调用

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

但是也存在zip的流包装器,请参阅this example,他们称之为:

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

要在zip-File test.odt中打开文件meta.xml(odt-files只是带有其他扩展名的zip文件)。

同样在another example中,他们通过流包装器直接打开一个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。