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

PHP-读取zip文件内容而不在服务器上保存,php,zip,Php,Zip,我有一个远程ZIP文件,我需要读取ZIP文件中的文件内容,而无需将ZIP文件复制到服务器。应该有办法解决这个问题,但我找不到 示例: URL-和 ZIP归档文件中的文件是feed.xml 我需要读取feed.xml的内容,并将其保存在一个变量中。就这样 我尝试了$z=new ZipArchive()和open,但open只能从服务器读取文件,不能从远程文件读取文件。这需要临时文件的概念。从技术上讲:是的,您将制作本地可用的远程zip文件的临时副本,因为您的ZipArchive根本无法处理远程zi

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

示例:
URL-和
ZIP归档文件中的文件是feed.xml

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


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

这需要临时文件的概念。从技术上讲:是的,您将制作本地可用的远程zip文件的临时副本,因为您的
ZipArchive
根本无法处理远程zip文件

执行临时复制的以下步骤应有助于您:

  • 将远程zip文件复制到临时文件夹中
  • 使用
    ZipArchive
    解析zip文件的本地副本
  • 读取feed.xml文件中的信息
  • 关闭并删除所有内容,然后删除zip文件的本地副本

  • 这需要临时文件的概念。从技术上讲:是的,您将制作本地可用的远程zip文件的临时副本,因为您的
    ZipArchive
    根本无法处理远程zip文件

    执行临时复制的以下步骤应有助于您:

  • 将远程zip文件复制到临时文件夹中
  • 使用
    ZipArchive
    解析zip文件的本地副本
  • 读取feed.xml文件中的信息
  • 关闭并删除所有内容,然后删除zip文件的本地副本

  • 超级惰性解决方案是:

    $feed = `wget http://example.com/feed.zip -qO-  | unzip - -p feed.xml`;
    
    请注意,如果url不是固定字符串,则应将其转义(escapeshellarg)


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

    超级惰性解决方案是:

    $feed = `wget http://example.com/feed.zip -qO-  | unzip - -p feed.xml`;
    
    请注意,如果url不是固定字符串,则应将其转义(escapeshellarg)


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

    我也有同样的问题,我能得到的最好结果就是将zip内容保存到临时文件,并使用它来获取压缩文件的内容:

    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内容保存到临时文件,并使用来获取压缩文件的内容:

    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 suggestion的实现。

    为什么不在服务器上复制它,阅读它,然后删除它?它的流量是相同的…为什么不在服务器上复制它,读取它,然后删除它呢?同样的流量…是的,我知道这样做很有效,但这不是最好的方式。这意味着我需要在我的文件运行相同目录结构的每台服务器上都有相同的目录结构等等。我认为这不是最好的方式。还有其他选择吗?@Niko-您不需要与服务器上的zip文件相同的目录结构:您直接从zip文件处理文件,而不是解压并遍历文件是的,我知道这样做是可行的,但这不是最好的方法。这意味着我需要在我的文件运行相同目录结构的每台服务器上都有相同的目录结构等等。我认为这不是最好的方式。还有其他选择吗?@Niko-您不需要与服务器上的zip文件相同的目录结构:您直接从zip文件处理文件,而不是解压并遍历文件mario,那么
    php://temp
    ?我在使用它时遇到的唯一问题是,一旦文件指针关闭,文件就消失了。我的想法是:写入临时文件,倒带文件,将文件指针传递到ZipArchive(不知怎么回事?)Mario,那
    php://temp
    ?我在使用它时遇到的唯一问题是,一旦文件指针关闭,文件就消失了。我的想法是:写入临时文件,倒带文件,将文件指针传递到ZipArchive(不知为什么?)