PHP中存在一组看起来很像的压缩解压函数:

压缩函数:gzcompress gzdeflate gzencode

解压函数:gzuncompress gzinflate gzdecode

gzdecode是PHP 5.4.0之后才加入的,使用的时候要注意兼容性问题。

这几个函数都以gz开头,让人想到gzip压缩,而光看函数名却又看不出它们之间的区别,只能查文档。

gzcompress gzdeflate gzencode函数的区别在于它们压缩的数据格式不同:

gzcompress使用的是ZLIB格式;

gzdeflate使用的是纯粹的DEFLATE格式;

gzencode使用的是GZIP格式;

但是有一点是相同的,它们压缩数据时都使用了DEFLATE压缩算法(理论上ZLIB和GZIP格式可以使用其他的压缩算法,但是目前实践中只使用DEFLATE算法),ZLIB和GZIP只不过是在DEFLATE的基础之上加了一些头部和尾部而已。

顺便提一下,HTTP协议中的Content-Encoding: deflate使用的是ZLIB格式而不是纯DEFLATE格式。

从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开始,这三个函数是一样的,只不过第三个参数的默认值不同;如果调用时传入第三个参数,那么这三个函数返回的数据相同。可以写一个简单的脚本测试:

$url = 'http://jb51.net';

$s1 = gzdeflate($url, 1);

$s2 = gzencode($url, 1, ZLIB_ENCODING_RAW);

if (strcmp($s1, $s2) == 0) echo 'the same';

?>

运行可以看到$s1和$s2是相同的,为什么会这样呢?可以从PHP源码中找到答案,打开php-5.5.4\ext\zip\zlib.c,可以找到这样的代码:

#define PHP_ZLIB_ENCODE_FUNC(name, default_encoding) \

static PHP_FUNCTION(name) \

{ \

char *in_buf, *out_buf; \

int in_len; \

size_t out_len; \

long level = -1; \

long encoding = default_encoding; \

if (default_encoding) { \

if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|ll", &in_buf, &in_len, &level, &encoding)) { \

return; \

} \

} else { \

if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl|l", &in_buf, &in_len, &encoding, &level)) { \

return; \

} \

} \

if (level < -1 || level > 9) { \

php_error_docref(NULL TSRMLS_CC, E_WARNING, "compression level (%ld) must be within -1..9", level); \

RETURN_FALSE; \

} \

switch (encoding) { \

case PHP_ZLIB_ENCODING_RAW: \

case PHP_ZLIB_ENCODING_GZIP: \

case PHP_ZLIB_ENCODING_DEFLATE: \

break; \

default: \

php_error_docref(NULL TSRMLS_CC, E_WARNING, "encoding mode must be either ZLIB_ENCODING_RAW, ZLIB_ENCODING_GZIP or ZLIB_ENCODING_DEFLATE"); \

RETURN_FALSE; \

} \

if (SUCCESS != php_zlib_encode(in_buf, in_len, &out_buf, &out_len, encoding, level TSRMLS_CC)) { \

RETURN_FALSE; \

} \

RETURN_STRINGL(out_buf, out_len, 0); \

}

/* NOTE: The naming of these userland functions was quite unlucky */

/* {{{ proto binary gzdeflate(binary data[, int level = -1[, int encoding = ZLIB_ENCODING_RAW])

Encode data with the raw deflate encoding */

PHP_ZLIB_ENCODE_FUNC(gzdeflate, PHP_ZLIB_ENCODING_RAW);

/* }}} */

/* {{{ proto binary gzencode(binary data[, int level = -1[, int encoding = ZLIB_ENCODING_GZIP])

Encode data with the gzip encoding */

PHP_ZLIB_ENCODE_FUNC(gzencode, PHP_ZLIB_ENCODING_GZIP);

/* }}} */

/* {{{ proto binary gzcompress(binary data[, int level = -1[, int encoding = ZLIB_ENCODING_DEFLATE])

Encode data with the zlib encoding */

PHP_ZLIB_ENCODE_FUNC(gzcompress, PHP_ZLIB_ENCODING_DEFLATE);

/* }}} */

可以看到,gzdeflate gzencode gzcompress三个函数都是用相同的PHP_ZLIB_ENCODE_FUNC宏定义的(是不是有些泛型的意味?),所以它们当然是相同的。

代码中的注释也承认这几个函数的名字起得不好,至于为什么会用这样的名字就不得而知了。

gzdeflate函数_PHP中的gzcompress、gzdeflate、gzencode函数详解_php实例相关推荐

  1. mysql敤 罚_php中mysql连接方式PDO使用详解,pdo浣跨敤璇﹁В_PHP教程

    php中mysql连接方式PDO使用详解,pdo浣跨敤璇﹁В PDO常用方法: PDO::query()主要用于有记录结果返回的操作(PDOStatement),特别是select操作. PDO::e ...

  2. mysql敤 罚_php中mysql连接方式PDO使用详解,pdo浣跨敤璇﹁В

    php中mysql连接方式PDO使用详解,pdo浣跨敤璇﹁В PDO常用方法: PDO::query()主要用于有记录结果返回的操作(PDOStatement),特别是select操作. PDO::e ...

  3. 二十、Kubernetes中Pod调度第二篇NodeAffinity详解、实例

    1.概述 在默认情况下,一个Pod在哪个Node节点上运行,是由Scheduler组件采用相应的算法计算出来的,这个过程是不受人工控制的.但是在实际使用中,这并不满足的需求,因为很多情况下,我们想控制 ...

  4. php写带分页的留言板,php中分页程序之基于留言板详解_PHP教程

    文章是重点是讲php中的分页原理,同时我们是利用一个实现来讲解如何在php中实现分页,这个就是基于自己写的留方板程序了,有需要的朋友可以参考一下,很适合于初学者哦. 分页的关键问题其实在于Mysql的 ...

  5. amp 符号 php,php中引用符号(amp;)的使用详解_PHP教程

    与C语言中的指针是有差别的.C语言中的指针里面存储的是变量的内容在内存中存放的地址变量的引用. PHP 的引用允许你用两个变量来指向同一个内容 复制代码 代码如下: $a="ABC" ...

  6. php 返回数组元素函数_php array_values 返回数组的所有值详解及实例

    php array_values php array_values 函数用于返回数组中所有的值,注意该函数将为新数组建立数组索引,原来的文字索引将不存在.本文章向大家讲解array_values函数的 ...

  7. android sqlite自定义函数,Android中自定义一个View的方法详解

    本文实例讲述了Android中自定义一个View的方法.分享给大家供大家参考,具体如下: Android中自定义View的实现比较简单,无非就是继承父类,然后重载方法,即便如此,在实际编码中难免会遇到 ...

  8. mysql pdo教程_php中mysql连接方式PDO使用详解

    本文主要详细介绍了PHP中mysql的连接方式PDO的各种使用方法,算是个人的一个小结,如有遗漏还请告之,有需要的小伙伴来参考下吧. PDO常用方法: PDO::query()主要用于有记录结果返回的 ...

  9. php中define的参数_php中define的含义及用法详解

    define()函数理解1(着重于作用的理解) define() 函数定义一个常量. 常量的特点: 常量类似变量,不同之处在于:在设定以后,常量的值无法更改常量名,不需要开头的美元符号 ($),作用域 ...

  10. java去掉字符串中前后空格函数_JAVA中去掉字符串空格各种方法详解

    1. String.trim() trim()是去掉首尾空格 2.str.replace(" ", ""); 去掉所有空格,包括首尾.中间 代码如下 复制代码 ...

最新文章

  1. Eigen库使用之矩阵的最大/小值及其位置
  2. StaticStack
  3. java.net.SocketException: Permission denied解决
  4. jquery中获取下拉框的文本值
  5. 网页特效:用CSS3制作3D图片立方体旋转特效
  6. 信息学奥赛一本通 1168:大整数加法 | OpenJudge NOI 1.6 10:大整数加法
  7. 从测试流程角度,阿里P8大佬对产品质量的一些总结思考...
  8. 软核、固核、硬核的区别
  9. [转]常见hash算法的原理
  10. linux常用命令详解和用法_详解Linux shell用法中常用命令--read(传参)
  11. 9008刷机模式写入超时刷机帮_【转】高通9008模式刷机,让小米刷机不再畏惧
  12. 山大往年自招计算机系试题,山大自招现场:考生笔试说“容易”体测喊“难”...
  13. 二级计算机考试什么最难,计算机二级考试难吗 考试内容是什么
  14. 纯干货:微软漏洞中国第一人黄正——如何用正确姿势挖掘浏览器漏洞(附完整 PPT)
  15. Greenplum5推出跨云能力,并与阿里云和腾讯云合作落地
  16. OutOfMemoryError(OOM)和StackOverflowError(SOF)异常总结
  17. where 空集_MySQL where 条件的这个坑你碰到过没
  18. 抖音如何热门,发布不会提示重复
  19. Mac提示来自身份不明的开发者
  20. linux系统 说法不正确的是,下面关于Linux操作系统的说法中,不正确的是( )。

热门文章

  1. 怎么在计算机修复flash,win10系统怎么用flash修复器?教你用flash修复器修复视频的方法...
  2. 常见30种数学建模模型_11.12|认识数学模型与数学建模许可
  3. caffe linux跑自己数据,caffe+linux平台——跑深度学习的流程
  4. SpringBoot 2 快速整合 | Hibernate Validator 数据校验
  5. 基于JAVA+SpringMVC+MYSQL的大学毕业生就业信息管理系统
  6. 基于JAVA+SpringBoot+Mybatis+MYSQL的医院信息管理系统
  7. cUBtYhaFzo
  8. delphi services允许跨域访问
  9. ARTetris-AR版俄罗斯方块的源码解析
  10. eclipse导入源码