使用PHP提取Zip档案


Extract a Zip Archive using PHP

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

$entry="test.zip";
    $zip = new ZipArchive;
    if ($zip->open($entry,ZIPARCHIVE::OVERWRITE) === TRUE)
    {
        $zip->extractTo('unpacked');
        $zip->close();
     }else 
     {
        echo ‘failed’;
     }

目录"unpacked"对每个人都是可写的,ZipArchive类的所有使用方法都返回true。然而,没有提取任何内容。有人知道是什么导致了这种行为吗?任何提示都将不胜感激。。。提前感谢!

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

您还可以检查PECL扩展,为了访问ZipArchive,您还可以尝试zip_open、zip_read进行检查。

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

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

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

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

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

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

$nbr_of_files = $zip->numFiles;

在使用每个文件的zip存档中的id号提取一个又一个文件之后,

$zip->extractTo('unpacked', array($zip->getNameIndex($file_nbr)));
请尝试从ZIPARCHIVE打开方法中删除ZIPARCHIVE::OVERWRITE标志。(如果您遵循了其他答案中的建议,则该标志可能无法正常工作,可能是问题的根源。)

我也遇到了同样的问题。解决方案:

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

添加CCD_ 2辅助函数。