WordPress程序中的几种文件打包压缩方法
在 WordPress 编程中经常会遇到打包压缩的需求,比如前端编辑好的内容进行后端压缩存储,数据库备份转储的文件做打包压缩,文件备份等场景。这些需求有三种方式来实现,包括 WordPress 自己的类库,PHP 的类库和第三方的类库,本篇文章逐一介绍。
一、WordPress 类库
WordPress 自带的压缩和解压缩类库叫做 “pclzip”,这个类库程序代码的存放位置在wp-admin/includes/class-pclzip.php文件里面,可以用来处理 zip 格式的文件。具体的使用方法如下:
...
if (is_readable(ABSPATH . 'wp-admin/includes/class-pclzip.php')) {
require_once(ABSPATH . 'wp-admin/includes/class-pclzip.php');
//压缩后的文件名存放在变量 $zip_file 中
$pz = new PclZip($zip_file);
//待压缩的文件名存放在变量 $rawfile 中
$created = $pz->create($rawfile, PCLZIP_OPT_REMOVE_PATH, dirname($rawfile));
//创建成功,删除原文件
if ($created) {
unlink( $rawfile );
}
}
...
解压缩工具用的是函数 unzip_file,该函数使用 ZipArchive 和 pclzip 两种方式之一来处理解压缩操作,先判断是否能用 ZipArchive,如不能再用 pclzip。
二、PHP 类库
PHP 压缩、解压缩的类库有很多种,都是通过扩展模块(extension)来实现的,详细的内容可以参考官网的说明,这里主要介绍两种,ZipArchive 和 PharData。
1、ZipArchive
使用该类库需要在编译 PHP 的时候加上 –with-zip (php 7.4)或者 –enable-zip(php 7.3)选项,可以参考这篇文章。压缩、解压缩 zip 的方法如下:
...
if (class_exists('ZipArchive') && apply_filters('unzip_file_use_ziparchive', true)) {
//设置内存需求
@ini_set('memory_limit', apply_filters('admin_memory_limit', WP_MAX_MEMORY_LIMIT));
//压缩
$z = new ZipArchive;
$opened = $z->open($zip_diskfile, ZipArchive::CREATE);
if ($opened === TRUE) {
$z->addFile($rawfile, basename($rawfile));
$z->close();
unlink( $rawfile );
}
//解压缩
$z = new ZipArchive;
if ($z->open($zip_diskfile) === TRUE) {
$z->extractTo($rawfile);
$z->close();
}
}
...
2、PharData
Phar 扩展模块在编译 PHP 的时候是自动捆绑的,所以编译好后可以直接使用(支持zip 和 tar)。操作系统库需要安装 zlib 和 bzip2。压缩、解压缩 zip 的方法如下:
...
//压缩
$p = new PharData($zip_diskfile);
if (is_dir($rawfile)) {
$p->buildFromDirectory($rawfile);
} else {
$p->addFile($rawfile, basename($rawfile));
}
//解压缩
try {
$p = new PharData($zip_diskfile);
$p->extractTo(dirname($zip_diskfile));
} catch (Exception $e) {
// 错误处理
}
...
三、第三方类库
有两个第三方库可以看看,Zippy 和 PHPArchive。Zippy 使用 了PHP 扩展,支持命令行,格式也更多一些。PHPArchive 是完全用 PHP 写的,支持 zip 和 tar。