【问题标题】:Extract a Zip Archive using PHP使用 PHP 提取 Zip 存档
【发布时间】:2015-04-22 20:14:17
【问题描述】:

我要做的基本上是在我的服务器上提取 Zip 档案的内容。这是一些代码:

$entry="test.zip";

    $zip = new ZipArchive;

    if ($zip->open($entry,ZIPARCHIVE::OVERWRITE) === TRUE)
    {
        $zip->extractTo('unpacked');
        $zip->close();

     }else 
     {
        echo ‘failed’;

     }

“解压”目录对每个人都是可写的,并且 ZipArchive 类的所有使用方法都返回 true。然而,没有任何东西被提取。有谁碰巧知道什么可能导致这种行为?任何提示将不胜感激...提前致谢!

【问题讨论】:

  • 您的网络服务器的错误日志说什么?如果打开error_reporting(E_ALL);,是否会显示额外的错误?
  • 我没有收到错误,当我回显 $zip 时,我得到的只是“真实”......这很奇怪
  • 当你var_dump($zip); 时你看到了什么?
  • 哦--当我使用 var_dump 时,我得到 num_files = 0...这可以解释为什么我返回 true 但没有提取任何内容...但是我的存档肯定包含文件...
  • 你试过从命令行运行它吗?运行此 PHP 脚本的进程(可能是您的 Web 服务器)是否具有对 zip 文件的读取权限?有很多基本的事情要检查...而且您确定 NOTHING 是在报告错误吗?

标签: php zip


【解决方案1】:

如果您使用的是 PHP 5.2.0 或更高版本,您可以先检查 zlib 扩展吗http://www.zlib.net/

您还检查PECL扩展,为了访问ZipArchive,您也可以尝试zip_open,zip_read只是为了检查。

【讨论】:

    【解决方案2】:

    如果此代码是内部代码,并且您可以放心地假设您不会将此代码从 Linux 移动到 Windows(反之亦然),您还可以选择执行本地系统命令,这可能会有所帮助解决你的问题。

    <?php
    
    echo `unzip myarchive.zip`; 
    echo `tar -xzf myotherarchive.tar.gz`;
    
    ?>
    

    在开发内部使用和/或维护脚本时,我曾经选择直接系统调用,因为它更符合系统管理员习惯使用的命令。

    【讨论】:

    • 感谢您的回答,我一定会尝试的。但是我仍然想知道为什么我的解决方案不起作用......
    • 如果文件是远程托管的,可以这样做吗?例如,wordpress,因此无需在本地下载和上传,只需将上述代码放在您的主机服务器上,然后直接从 wordpress.org 提取 wordpress 存档到其中。
    【解决方案3】:

    如果失败,您应该回显$zip,因为它包含错误。 此外,我猜您可能没有 test.zip 所需的权限

    【讨论】:

      【解决方案4】:

      如果您的 zip 存档很大,有时您无法在服务器允许的最大执行时间内提取所有文件。

      如果您无法更改 php.ini 中的 maximum_execution_time,唯一的解决方案是使用 javascript 一个接一个地提取文件。在第一个 javascript 请求中,您获取存档中的文件数

      $nbr_of_files = $zip->numFiles;
      

      在您使用每个文件的 zip 存档中的 id 号一个接一个地提取一个文件之后

      $zip->extractTo('unpacked', array($zip->getNameIndex($file_nbr)));
      

      【讨论】:

        【解决方案5】:

        请尝试从 ZipArchive 打开方法中删除 ZIPARCHIVE::OVERWRITE 标志。 (如果您遵循其他答案中的建议,该标志可能无法按预期运行,并且可能是问题的根源。)

        【讨论】:

          【解决方案6】:

          我也有同样的问题。解决办法:

          $zip->extractTo(public_path() .'/restoreDb/extracted/');
          

          添加 public_path() 辅助函数。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-03-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多