我可以在 PHP 中包含来自 zip 文件的文件吗?例如,考虑我有一个 zip 文件 - test.zip 和 test.zip 包含一个名为 a.php 的文件。现在,我想做的是如下所示,
包括“test.zip/a.php”;
这可能吗?如果是,谁能给我一个代码片段?如果没有,是否还有其他替代方法可以做到这一点?
我可以在 PHP 中包含来自 zip 文件的文件吗?例如,考虑我有一个 zip 文件 - test.zip 和 test.zip 包含一个名为 a.php 的文件。现在,我想做的是如下所示,
包括“test.zip/a.php”;
这可能吗?如果是,谁能给我一个代码片段?如果没有,是否还有其他替代方法可以做到这一点?
$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));
大家确定吗?根据 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。