找回密码
 注册

[PHP] PHP ZipArchive 的坑

php 发表于 2015/12/17 07:03 | 显示全部楼层 |阅读模式
PHP ZipArchive有很多坑,一不小心就会陷进去,导致看似一切正常的程序完全得不到预期的结果。
  • ZipArchive创建或者打开的zip文档,在ZipArchive::close()这个方法被调用之前,只是在操作一个临时的文件,只有在调用了close()方法之后,压缩文档才会真正的开始完成文件的操作和保存工作,如果没有在代码里面明确调用close()这个方法,PHP会在代码最后自动去调用。
    比如很多人遇到的问题,先将一个文件压缩进zip文档中,然后将文件删除,如以下代码,当addFile()调用完成以后,虽然返回了true,但是这个时候PHP并没有正在地将文件加入到压缩文件中,而只是对操作作了一个“预登录”,直接$za->close()调用的时候才会真正去完成添加文件的操作,然而很遗憾的是,如下代码中,在执行添加操作的时候,文件早就被删除了,因此程序出错,无论之前对压缩文件做过多少操作,一切都是徒劳,因为压缩文件没有创建成功,如果该压缩文件早前已经存在,文件不会有任何变化。参见:PHP压缩文件夹和子目录为zip文件 使用内置ZipArchive类实现
    1. <?php
    2.         $za = new ZipArchive();
    3.         $za->open('./xc.zip', ZipArchive::CREATE|ZipArchive::OVERWRITE);
    4.         $file = './notes.txt';
    5.         if( true === $za->addFile($file)){
    6.                 unlink($file);
    7.         }
    8.         if(!$za->close()){
    9.                 echo 'failure.';
    10.         }
    11. ?>
    复制代码

  • ZipArchive::addFile($file, $saveAs) 如果$file是一个目录的路径,会导致程序出错,无论你之前做过多少操作,直接回到解放前,文件不会创建成功,如果该压缩文件早前已经存在,文件不会有任何变化,更气人的是,如果目录是真实存在的的话,它的返回值还是true.
    因此,如果通过scandir()之类的函数获取目录的文件列表的话,一定要记得把返回的文件列表中的子目录给删除掉,只保留子目录里面的文件。
    参见:ZipArchive addFile 传递的参数是文件夹时将导致整个代码失效

手机版|轻松E站

轻松E站

快速回复 返回顶部 返回列表