我可以在PHP中包含zip文件中的文件吗?例如,我认为我有一个zip文件 - test.zip和test.zip包含一个名为a.php的文件。现在,我想做的是下面的事情,
包括“test.zip/a.php”;
这可能吗?如果可以,任何人都可以提供我的代码片段?如果没有,还有其他任何替代方法吗?
答案 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。