Linux系统一直对ZIP格式提供了良好的支持,在Linux系统中有unzip命令可以解压缩文件包,这对于使用SSH在Dreamhost上搭建博客的朋友是一个十分方便的功能。此外,7ZIP(推荐,开源免费)与WinRAR是常用于Win系统上的ZIP压缩/解压缩软件。在PHP中我们该如何使用压缩和解压缩功能呢?
上回我做了一个一键下载WP主题的插件Get_Theme,代码核心的两部分分别是下载与解压缩。下载比较简单了,通常是用file_get_contents(FILENAME); 这函数或者用 fsockopen 函数下载即可,可解压缩部分就比较复杂点了。由于我对ZIP也算是一无所知,唯一知道的就是PHP似乎内置了对ZIP/UNZIP的支持。后来一查文档才发现,这个功能需要加载额外的DB库,并且有些主机不支持。还好网上提供了很多不需要加载库的解决方案。
第一次用了PHPMYADMIN里面的unzip库。如果有本地用XAMPP搭建测试平台的不妨到 phpMyAdmin/libraries 目录下,找到 unzip.lib.php,里头有个 SimpleUnzip 的UNZIP类,它的作用是将一个ZIP文件解析出一个二维数组,这个数组中每个文件又是一个数组,数组中包含了路径、文件数据、创建时间等信息,解出数组后还要根据每个文件的路径判断是否需要新建文件夹等。后来我用这个类在本地的PHP环境中测试了一下,工作得不错。但当我把它上传到Dreamhost空间进行测试的时候却出现了问题。当我从Wordpress主题站下载主题进行测试解压时,解压后的每个文件均能被正常识别、创建,但文件里的内容都是乱码。我一直不解其中原因。后来我想起7ZIP里面有个似乎可以查看压缩算法的功能,看了一下,算法好像都是 Deflate。而下面的主操作系统信息引起了我的怀疑。我在本地压缩的几个主题包的主操作系统都是 FAT ,而WP主题站下载的主题的主操作系统都是 UNIX ,可能是由于数据的存储方式不同导致了这个问题。 而后我又记起了WP自己拥有的插件升级功能,必然也需要用到UNZIP功能,在WP的文件里找了一下,终于找到了一个UNZIP类,它位于 wp-admin/includes/ 下的 class-pclzip.php 用这个 PclZip 类很容易地解析出了ZIP包的内容,同样需要进行创建文件夹、文件等操作。
这里说一下大概过程,假设有个$archive_files数组,里面有数个$file数组,$file里是真正的每个文件的数据,如$file[filename] 是文件名(包含文件路径,有可能是 file.php 也有可能是 /dir/file.php),$file[content]是文件数据,还有创建时间修改时间等就不列了。
有了文件名首先把它连上绝对路径,用file_exists()或is_dir()的函数判断路径是否存在,不存在就要创建。判断的时候还要注意有可能存在多级文件夹未创建的情况,所以应该先用 explode 函数分解成几个数组,用个for循环把每级目录都判断一遍,不存在则创建。
接下来就是用文件函数创建函数了。