PHP 字符串压缩详解

想象一个场景,有一个很长的字符串需要存储到文件或者数据库中,而且有好多这种字符串,这个时候直接拿着这个字符串去操作可能会存在一定的效率问题,有没有一种方式可以缩短每个很长的字符串去存储,然后我们在获取使用的时候还会保持和之前字符串一样,这样就可以一举两得了,要想实现这个需求就需要用到PHP中的压缩技术了。

W3CAPI
1
2020-04-25 08:46:03
文档目录
我的书签
 

什么是字符串压缩?

字符串压缩的概念和定义,相信已经可以呼之欲出了,因为我们在提纲上已经说明了为什么需要字符串压缩:把很长的字符串处理为较短的字符串进行存储,在获取使用的时候又可以恢复到原始字符串的长度和内容。
在PHP编程中,PHP已经给我们提供了几个很完善的字符串压缩函数:gzcompress gzdeflate gzencode,他们分别使用了不同的压缩算法来达到我们想要的效果,那么与之对应,就存在可以把压缩过的字符串恢复成原来字符串的长度和内容的操作,那就是解压缩,PHP也提供了和压缩对应的压缩函数:gzcompress gzdeflate gzencode,下面我们分别来说明他们的使用方法和技巧。

PHP 字符串压缩函数 gzcompress 和 gzuncompress 详解

一、定义和用法

gzcompress 函数,使用 ZLIB 数据格式 压缩给定的字符串,具体压缩算法可查阅:RFC 1950《ZLIB压缩数据格式规范版本3.3 》。如果压缩失败会返回false,适用版本:(PHP 4 >= 4.0.1, PHP 5, PHP 7)

二、语法格式

gzcompress ( string $data [, int $level = -1 [, int $encoding = ZLIB_ENCODING_DEFLATE ]] ) : string 

三、参数说明

参数 说明
data 要压缩的字符串
level 压缩级别。可以指定为0(表示无压缩),指定为9(表示最大压缩)。
如果使用-1,则使用zlib库的默认压缩为6。
encoding 压缩采用的编码算法,一个ZLIB_ENCODING_*的常数(ZLIB_ENCODING_RAW 、ZLIB_ENCODING_DEFLATE、ZLIB_ENCODING_GZIP),可以看出来它可以使用不同的压缩算法进行压缩

四、使用用例

$len_str = <<<STR
11111111111111111111111111111111111111111
11111111111111111111111111111111111111111
1111111111111111111111111111111
STR;
echo "压缩前:";
var_dump($len_str);
$result = gzcompress($len_str);
echo "<br/> 压缩后:";
var_dump($result);
echo "<br/> 解压后:";
var_dump(gzuncompress($result));

PHP 字符串压缩函数 gzdeflate 和 gzinflate 详解

一、定义和用法

gzdeflate 函数使用 DEFLATE 数据格式 压缩给定的字符串,字面意思可以看出来此函数压缩率会更高,DEFLATE压缩算法的详细信息,请参见文档:RFC 1951《DEFLATE压缩数据格式规范版本1.3》。压缩失败返回false,版本说明:(PHP 4 >= 4.0.4, PHP 5, PHP 7)

二、语法格式

gzdeflate ( string $data [, int $level = -1 [, int $encoding = ZLIB_ENCODING_RAW ]] ) : string

三、参数说明

参数 说明
data 要压缩的字符串
level 压缩级别。可以指定为0(表示无压缩),指定为9(表示最大压缩)。如果未给出,则默认压缩级别将是zlib库的默认压缩级别。
encoding 压缩采用的编码算法,一个ZLIB_ENCODING_*的常数(ZLIB_ENCODING_RAW 、ZLIB_ENCODING_DEFLATE、ZLIB_ENCODING_GZIP),可以看出来它可以使用不同的压缩算法进行压缩

四、使用用例

$len_str = <<<STR
11111111111111111111111111111111111111111
11111111111111111111111111111111111111111
1111111111111111111111111111111
STR;
echo "压缩前:";
var_dump($len_str);
$result = gzdeflate($len_str,9);
echo "<br/> 压缩后:";
var_dump($result);
echo "<br/> 解压后:";
var_dump(gzinflate ($result));

PHP 字符串压缩函数 gzencode 和 gzdecode详解

一、定义和用法

gzencode 函数 压缩一个字符串与gzip程序输出兼容的压缩版本 。有关GZIP文件格式的更多信息,请参见文档: RFC 1952《GZIP文件格式规范版本4.3》。版本说明:(PHP 4 >= 4.0.4, PHP 5, PHP 7)

二、语法格式

gzencode ( string $data [, int $level = -1 [, int $encoding_mode = FORCE_GZIP ]] ) : string

三、参数说明

参数 说明
data 要压缩的字符串数据
level 压缩级别。可以指定为0(表示无压缩),指定为9(表示最大压缩)。如果未给出,则默认压缩级别将是zlib库的默认压缩级别。
encoding 编码模式。可以是FORCE_GZIP(默认值)或FORCE_DEFLATE。
在PHP 5.4.0之前的版本中,FORCE_DEFLATE在gzip文件标头之后使用标准zlib压缩字符串(包括zlib标头),但没有尾随crc32校验和。
在PHP 5.4.0及更高版本中,FORCE_DEFLATE生成符合RFC 1950的输出,包括zlib标头,压缩的数据和Adler校验和。

四、使用用例

$len_str = <<<STR
11111111111111111111111111111111111111111
11111111111111111111111111111111111111111
1111111111111111111111111111111
STR;
echo "压缩前:";
var_dump($len_str);
$result = gzencode($len_str,9);
echo "<br/> 压缩后:";
var_dump($result);
echo "<br/> 解压后:";
var_dump(gzdecode ($result));

PHP 字符串压缩函数gzcompress、gzdeflate、gzencode比较

通过上面对每一个压缩函数的了解,我们可以看出来三个函数在用法上基本上是一致的,他们都可以指定不同的压缩算法进行压缩,为什么还要把他们区分出来呢?因为从PHP 5.4.0开始,gzcompress和gzdeflate函数加入了第三个参数$encoding,可以是三个常量:
  • ZLIB_ENCODING_RAW 对应于纯DEFLATE格式
  • ZLIB_ENCODING_GZIP 对应于GZIP格式
  • ZLIB_ENCODING_DEFLATE 对应于ZLIB格式(注意不是纯DEFLATE格式)
虽然文档没有提及,但是这三个常量也可以用在gzencode函数的第三个参数$encoding_mode中。其实从PHP 5.4.0开始,这三个函数是一样的,只不过第三个参数的默认值不同;如果调用时传入第三个参数,那么这三个函数返回的数据相同。这可能是在设计的时候没有考虑完善,为了保持兼容采取的变通方式吧!
友情提示