php 数组函数gzencode函数需要扩展吗

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_ \
&&& int in_ \
&&& size_t out_ \
&&& long level = -1; \
&&& long encoding = default_ \
&&& if (default_encoding) { \
&&&&&&& if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, &s|ll&, &in_buf, &in_len, &level, &encoding)) { \
&&&&&&&&&&& \
&&&&&&& } \
&&& } else { \
&&&&&&& if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, &sl|l&, &in_buf, &in_len, &encoding, &level)) { \
&&&&&&&&&&& \
&&&&&&& } \
&&& 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: \
&&&&&&&&&&& \
&&&&&&& 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宏定义的(是不是有些泛型的意味?),所以它们当然是相同的。
代码中的注释也承认这几个函数的名字起得不好,至于为什么会用这样的名字就不得而知了。
相关文章列表:PHP不常见的函数整理
我的图书馆
PHP不常见的函数整理
最新PHP不常见的函数整理
以下是为大家整理的最新的文章,希望大家能够喜欢!
下面为大家带来一篇 PHP不常见的函数整理。下面就为你详细讲解一下,希望对您的学习PHP有所帮助。
sys_getloadavg()
这个函数返回当前系统的负载均值信息(当然 Windows 下不适用),详细文档可以翻阅 PHP 的相关文档。文档中有段示例代码,基本上也就能看出它的用途了。
$load = sys_getloadavg();
if ($load[0] & 80) {
header('HTTP/1.1 503 Too busy, try again later');
die('Server too busy. Please try again later.');
PS,如果“很不幸”得你的 PHP 环境中没有这个函数,可以考虑使用下面这段代码 via
if (!function_exists('sys_getloadavg')) {
function sys_getloadavg()
$loadavg_file = '/proc/loadavg';
if (file_exists($loadavg_file)) {
return explode(chr(32),file_get_contents($loadavg_file));
return array(0,0,0);
这一特性如果使用得当,能减轻服务器部分压力。
pack 对应的还有个函数为 unpack,用于压缩二进制串,文中的作者的示例非常清楚
$pass_hash = pack("H*", md5("my-password"));
如果你使用 PHP5,那么可以直接这样子
$pass_hash = md5("my-password", true); // PHP 5+这样做的好处之一是能减少串存储空间(能节省多少呢?可能又会是另篇文章了)。
这里还有个示例代码可以 pack 数组 via
function pack_array($v,$a) {
return call_user_func_array(pack,array_merge(array($v),(array)$a));
cal_days_in_month()
该函数可以直接返回指定月份中的天数,例如
$days = cal_days_in_month(CAL_GREGORIAN, date("m"), date("Y")); // 31我敢保证,你自己实现过类似功能的函数 :^)
呃,这的确也是个 PHP 函数(也有可能是最短的 PHP 内置函数)。_() 是它的“小名”,它的大名是 gettext()。
写过 Wordpress 皮肤的朋友会了解 __() 以及 _e() 这些函数,其实 PHP 早已经自带了相关的功能。
// Set language to German
setlocale(LC_ALL, 'de_DE');
// Specify location of translation tables
bindtextdomain("myPHPApp", "./locale");
// Choose domain
textdomain("myPHPApp");
echo _("Have a nice day");
利用 gettext 可以编写多语言的应用,现在您感兴趣的可能就是如何编写 locale 文件,这但已经不是此文涉及的重点,更多信息可以移步到这里。
get_browser()
坦白讲,见到这个函数我当时就彻底泪奔。有了这个函数,再也不用自己去分析 $_SERVER['HTTP_USER_AGENT'] 这个字符串了。
更多的信息可以参考这里。在使用此函数前,你可能需要个 browscap.ini 配置文件,相信你可以搞定的。
debug_print_backtrace()
以前查看函数调用堆栈,我会使用 xdebug 等的扩展,其实 PHP5 版本以后已经内置了相关的函数。
顺便再分享个“蛋疼”的小技巧,如果你记不住这个函数的名字,可以用这段代码同样能达到目的(看起来还是记住那个函数靠谱):
$e = new Exception();
print_r(str_replace('/path/to/code/', '', $e-&getTraceAsString()));natsort()
这个函数用于自然排序,这个大家可能都要用到。贴下相关的文档链接以及示例代码
$items = array("100 apples", "5 apples", "110 apples", "55 apples");
// normal sorting:
sort($items);
print_r($items);
# Outputs:
# [0] =& 100 apples
# [1] =& 110 apples
# [2] =& 5 apples
# [3] =& 55 apples
natsort($items);
print_r($items);
# Outputs:
# [2] =& 5 apples
# [3] =& 55 apples
# [0] =& 100 apples
# [1] =& 110 apples
# )有关自然排序的算法规则,可以参考这里的文档。
这个函数的功能同样让人感到泪奔,先不说功能直接上示例代码
foreach (glob("*.php") as $file) {
echo "$file\n";
相比你已经了解该函数的用途了,那么我们就可以有更多的“玩法”,例如就显示目录(via):
$dirs = array_filter(glob($path.'*'), 'is_dir');
当然,文件递归你也可以考虑使用下 SPL 扩展。
补充 by 神仙:
glob 有个参数选项 GLOB_ONLYDIR 就可以只列目录PHP Filter
如果你还在正则验证字符串,那么就真的“Out”了。自 PHP5.2 版本以后,内置了 PHP Fliter 模块用于专门验证 电子邮件、URL 等是否合法,示例代码:
var_dump(filter_var('', FILTER_VALIDATE_EMAIL));
由于是新生的模块,因此还有很多的陷阱,例如
filter_var('abc', FILTER_VALIDATE_BOOLEAN); // bool(false)
filter_var('0', FILTER_VALIDATE_BOOLEAN); // bool(false)
但这不影响我们去尝试。有关 PHP Filter 的更多信息,相信能拎出来另外写篇文章了。
-- Split --
最后,感叹 PHP 其实是个历久弥新的工具,不小心我们就会悲剧性得重复造了只轮子。因此,时常看看 PHP 文档每次都会有新的收获。
以上就是关于 PHP不常见的函数整理 的内容,希望已经解决你的问题。
TA的最新馆藏上一篇:下一篇:
示例代码: CSS-JS合并/压缩 MuneeMunee是一个集图片尺寸调整、CSS-JS合并/压缩、缓存等功能于一身的PHP库.可以在服务器...
加php自学与交流QQ群:极客学院教学视频想要领取极... 打包压缩和解包用什么命令?软连接和硬链接有什么区别?建立软...
PHP自学中心
示例代码: CSS-JS合并/压缩 MuneeMunee是一个集图片尺寸调整、CSS-JS合并/压缩、缓存等功能于一身的PHP库.可以在服务器...
里面放的是在解压zip压缩包里的文件时调用的回调函数.在open()函数里,这个回调函数会被初始化成read_data()再转回php脚...
上海交大软件安全研究组GoSSIP
数据资源的压缩,很多情况下是竞争的要素.1、越小的文件,传... 那么6M包含什么呢? 我的代码是php写的,跑在apache的...
caoz的梦呓
那说明没有下载对吧,这么是一个个下载啊,不是有一个统一的软件---appserv (appserv 是 php 网页架站工具组合包,作者将一些网络上免费的架站资源重新包装成单一的安装程序,以方便初学者快...
单个文件可以使用 stream filters,不过目录没法解决.php: stream filtersphp: compression filtersstackoverfllow 有一个采用开启进程的方案.on-the-fly zipping & streaming of large files, in php or otherwise...
看下我博客的文件夹打包类/post-48.html
lame mp3 encoder is the best mp3 encoder and is available for free!
我也是初次接触protobuf,请问您的问题有结论了吗?
今日推荐本周推荐本月推荐
4 天前标签:
06-04标签:
06-04标签:
06-04标签:
06-04标签:
MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式.这种模式用于应用程序的分层开发.Model(模型) - 模型代表一个...
西科大C语言
MVC版本是4.2.3,建议使用最新的版本.由于Spring MVC的良好封装,异步功能使用起来出奇的简单.传统的同步模式的Controller是...
pr.callnil调用时使用了多个参数,只取第一个参数,扔掉剩下的:&& pr.call(1,2,3)1用 lambda 与 -& 创建函数lambda 方法返回一个 Proc ...gzencode 默认使用ZLIB_ENCODING_GZIP编码,使用gzip压缩格式,实际上是使用defalte 算法压缩数据,然后加上文件头和adler32校验
gzdeflate 默认使用ZLIB_ENCODING_RAW编码方式,使用deflate数据压缩算法,实际上是先用 LZ77 压缩,然后用霍夫曼编码压缩
gzcompress ;默认使用ZLIB_ENCODING_DEFLATE编码,使用zlib压缩格式,实际上是用 deflate 压缩数据,然后加上 zlib 头和 CRC 校验
echo '&br&';
echo 'a的长度:'.strlen($a);
echo '&br&';
'gzcompress';
echo '&br&';
echo $m = base64_encode(gzcompress($a));
echo '&br&';
echo 'm的长度:'.strlen($m);
echo "&br&";
'gzdeflate';
echo '&br&';
echo $m = base64_encode(gzdeflate($a));
echo '&br&';
echo 'm的长度:'.strlen($m);
echo '&br&';
'gzencode';
echo '&br&';
echo $m = base64_encode(gzencode($a));
echo '&br&';
echo 'm的长度:'.strlen($m);
这三个函数的比较实质上是三种压缩方法:deflate, zlib, gzip的比较。从性能的维度看:deflate 好于 gzip 好于 zlib从文本文件默认压缩率压缩后体积的维度看:deflate 好于 zlib 好于 gzip
阅读(...) 评论()

我要回帖

更多关于 php substr函数 的文章

 

随机推荐