PHP-读取zip文件内容而不保存在服务器上


PHP - read zip file contents without saving on server

我有一个远程ZIP文件,我需要读取ZIP文件中的文件内容,而无需将ZIP文件复制到我们的服务器。应该有一些解决方案来解决这个问题,但我找不到

示例:
URL-http://example.com/feed.zip和
ZIP档案中的文件是feed.xml

我需要读取feed.xml的内容并将其保存在一个变量中。就是这样。

我尝试过$z = new ZipArchive();和open,但open只能从服务器读取文件,而不能读取远程文件。

一个超级懒惰的解决方案是:

$feed = `wget http://example.com/feed.zip -qO-  | unzip - -p feed.xml`;

请注意,如果url不是固定字符串,则应该对其进行转义(escapeshellarg)。

但您也可以研究内置ZipArchive之外的其他ZIP类。PEAR或PclZip可能允许在没有解决方案的情况下从流中读取。(但是php://memory如果你真的想避开临时文件,那么字符串流包装器也可能是可行的。)

我也遇到了同样的问题,我能得到的最好的方法是将zip内容保存到临时文件中,并使用ZipArchive来获得压缩文件的内容:

public static function unzip($zipData) {
    // save content into temp file
    $tempFile = tempnam(sys_get_temp_dir(), 'feed');
    file_put_contents($tempFile, $zipData);
    // unzip content of first file from archive
    $zip = new ZipArchive();
    $zip->open($tempFile);
    $data = $zip->getFromIndex(0);
    // cleanup temp file
    $zip->close();
    unlink($tempFile);
    return $data;
}

这基本上是@mauris建议的实现。

这需要临时文件的概念。从技术上讲:是的,您将制作一个本地可用的远程zip文件的临时副本,因为您的ZipArchive根本不适用于远程zip文件。

按照以下步骤实现临时复制应该会对您有所帮助:

  1. 将远程zip文件复制到临时文件夹中
  2. 使用ZipArchive解析zip文件的本地副本
  3. 阅读feed.xml文件中的信息
  4. 关闭所有内容并删除zip文件的本地副本