在日常的开发和电脑使用中,我们经常会接触到压缩和解压的一些工具,PHP 也为我们准备了很多相关的操作扩展包,都有直接可用的函数能够方便的操作一些压缩解压功能。今天,我们先学习一个比较简单但不太常用的压缩格式:Bzip2。

安装扩展

这个扩展的安装需要系统有 bzip2-devel 。所以我们需要先给系统装上这个软件包的支持,然后这个扩展是随 PHP 安装包一起发布的,所以只需要编译一下 PHP ,并在 ./configure 中添加对应的编译命令即可。

# yum install bzip2-devel
# ./configure xxxx --with-bz2
# make && make install

基本操作

Bzip2 提供的函数不多,而且非常简单,我们首先来看的是将字符串保存到一个文件中。

$bz = bzopen('/tmp/test.bz', 'w');
// -rw-r--r-- 1 root root 14 Jun 28 09:51 test.bz $text = "This is Bz Compress";
bzwrite($bz, $text);
// -rw-r--r-- 1 root root 59 Jun 28 09:53 test.bz bzclose($bz); $bz = bzopen('/tmp/test.bz', 'r'); $v = bzread($bz);
echo $v, PHP_EOL;
// This is Bz Compress bzclose($bz);

就和文件操作函数一样,我们需要先通过 bzopen() 打开文件获得句柄。然后使用 bzwrite() 来写入文件,并使用 bzread() 来读取文件。最后使用 bzclose() 来关闭文件。

这里需要注意的是 bzopen() 的第二个参数,也就是文件打开的形式,只能写 "w" 或者 "r" 。它没有其它类型,并且不能同时读写,也就是不能写成 "wr" 这种形式。所以我们在写完文件后又要再使用 "r" 打开文件才能进行读取。

读取长度设置

$bz = bzopen('/tmp/test.bz', 'r');

$v = bzread($bz, 10);
echo $v, PHP_EOL;
// This is Bz $v = bzread($bz);
echo $v, PHP_EOL;
// Compress bzclose($bz);

bzread() 的第二个参数是可选的字节长度,默认是 1024 ,一次最大可读入 8192 个未压缩字节。

字符串编码

Bzip2 扩展还为我们提供了直接对字符串编码的函数。不用每次都存入文件中,如果是相同的字符串,使用字符串编码的函数和输出到文件中的内容是一样的乱码的二进制内容。

$str = "Test compress String";

$bzstr = bzcompress($str, 9);
echo $bzstr, PHP_EOL;
// BZh91AY&SY��J���@
//
// �� 1
// df����2�h>.�p�!��// $newStr = bzdecompress($bzstr);
echo $newStr, PHP_EOL; $chineseStr = "测试";
$bzstr = bzcompress($chineseStr, 9);
echo bzdecompress($bzstr), PHP_EOL;

bzcompress() 用于将字符串进行编码压缩,第二个参数是压缩的比率,9 为最高等级。编码后的内容是非人类的二进制乱码内容。bzdecompress() 用于对已编码的内容进行解码。相信不少小伙伴已经发现了,这个可以用来做一些保密内容的加密传输。同时,在测试代码中,我们可以看到,它对中文也是正常支持的。

错误信息

最后,我们来看一下 Bzip2 的错误处理函数。

$bz = bzopen('/tmp/test.bz', 'r');
bzwrite($bz, 'aaa');
print_r(bzerror($bz));
// Array
// (
// [errno] => -1
// [errstr] => SEQUENCE_ERROR
// ) echo bzerrno($bz), PHP_EOL; // -1
echo bzerrstr($bz), PHP_EOL; // SEQUENCE_ERROR bzclose($bz);

我们首先构造了一个错误环境。使用 "r" 打开文件获得句柄后,对这个文件进行写入操作。bzerror() 会返回一个错误信息的数组,里面包含了错误号和错误信息内容。而 bzerrno() 和 bzerrstr() 则是单独地分别返回错误号和错误内容。三个非常简单并且好理解的函数。

总结

这个扩展还是非常简单的,最主要的是 Bzip2 这种压缩文件类型也并不是非常常用的类型,所以可能知道的人并不多。但是我们还是从中发现了一丝丝的惊喜,就是它提供了字符串的编解码函数,这两个函数确实是可以在某些场景下作为信息加密的手段来使用。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202006/source/PHP%E7%9A%84Bzip2%E5%8E%8B%E7%BC%A9%E6%89%A9%E5%B1%95%E5%B7%A5%E5%85%B7.php

参考文档:

https://www.php.net/manual/zh/book.bzip2.php

关注公众号:【硬核项目经理】获取最新文章

添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料

知乎、公众号、抖音、头条搜索【硬核项目经理】

B站ID:482780532

PHP的bz2压缩扩展工具的更多相关文章

  1. PHP的LZF压缩扩展工具

    这次为大家带来的是另外一个 PHP 的压缩扩展,当然也是非常冷门的一种压缩格式,所以使用的人会比较少,而且在 PHP 中提供的相关的函数也只是对字符串的编码与解码,并没有针对文件的操作.因此,就像 B ...

  2. Linux中常用压缩打包工具

    Linux中常用压缩打包工具 压缩打包是常用的功能,在linux中目前常用的压缩工具有gzip,bzip2以及后起之秀xz.本文将介绍如下的工具常见压缩.解压缩工具以及打包工具tar. gzip2 直 ...

  3. pycharm中添加扩展工具pylint

    今天调试了好几个小时,想吧pylint集成到pycharm中去,从网上找了个宝贝帖 子,但是不好用,原因是作者写的脚本是检查工程和模块的,而我的是单独检查一个文件,当然前者肯定会在项目后期用的.所以就 ...

  4. jQuery源码分析-03扩展工具函数jQuery.extend

    // 扩展工具函数 jQuery.extend({ // http://www.w3school.com.cn/jquery/core_noconflict.asp // 释放$的 jQuery 控制 ...

  5. Adobe Photoshop CC 2015使用及扩展工具

    VAdobe Photoshop CC 2015: 简称"PS",是由Adobe Systems开发和发行的图像处理软件 扩展工具: Cuuterman:切图插件: 一个一个切图, ...

  6. Visual Studio 2013编辑器+SourceTree代码管理工具及扩展工具

    Visual Studio 2013: 美国微软公司的编辑开发工具 扩展工具: Resharper:进行深度代码分析,函数深度查询(ctrl+鼠标左): Grunt:是基于Node.js的项目以自动化 ...

  7. Linux上超酷的命令行扩展工具Oh My Zsh

    Oh My Zsh 是一款社区驱动的命令行工具,正如它的主页上说的,Oh My Zsh 是一种生活方式.它基于 zsh 命令行,提供了主题配置,插件机制,已经内置的便捷操作.给我们一种全新的方式使用命 ...

  8. [Unity3D] 5.0 图集合并扩展工具,用于解决UGUI与AssetBundle打包造成资源包过大的问题

    [Unity3D] 5.0 图集合并扩展工具,用于解决UGUI与AssetBundle打包造成资源包过大的问题 2017年07月05日 15:57:44 阅读数:1494 http://www.cpp ...

  9. Windbg脚本和扩展工具开篇

    好长一段时间没写文章了,最近一直忙于为项目的可调式性做一些脚本和扩展工具,鉴于对windbg强大威力的震撼,以及相对较少的资料,笔者决定写一系列关于如何开发Windbg脚本和扩展命令的文章,您的支持是 ...

随机推荐

  1. WPF自定义控件二:Border控件与TextBlock控件轮播动画

    需求:实现Border轮播动画与TextBlock动画 XAML代码如下: <Window.Resources> <Storyboard x:Key="OnLoaded1& ...

  2. Elasticsearch BM25相关度算法超详细解释

    Photo by Pixabay from Pexels 前言:日常在使用Elasticsearch的搜索业务中多少会出现几次 "为什么这个Doc分数要比那个要稍微低一点?".&q ...

  3. 从net到java:MyBatis快速入门

    第一:这不是net与java的对比,只是我学习java相关知识梳理的笔记. 第二:这也没有否认net,只是现在的工作需要自己会java. 第三:这不深入.只是我看了些官网和网上的视频,算是入门的总结. ...

  4. jvm调优命令

    JDK监控和故障jps,jstat,jmap,jhat,jstack.jinfo jps ,JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程. jstat ...

  5. shell脚本基本使用教程

    sh脚本的固定第一行 #!/bin/bash 变量 #!/bin/bash var1=1 var2=2 var3=$[var1+var2] echo "$var3" 传达参数 sh ...

  6. vue + iview 怎样在vue项目下添加ESLint

    参考:https://segmentfault.com/a/1190000012019019?utm_source=tag-newest 使用iview框架的MenuGroup标签,vscode报红, ...

  7. openstack新建实例各种报错解决

    最近自己装了下Openstack,零基础安装,参照了网上不少教程. 吃了百家饭的后果,就是出现了一堆不明问题...openstack安装比较复杂,很多配置文件,一个地方配置不正确,可能会导致后面的功能 ...

  8. 第13篇-通过InterpreterCodelet存储机器指令片段

    在TemplateInterpreterGenerator::generate_all()函数中生成了许多字节码指令以及一些虚拟机辅助执行的机器指令片段,例如生成空指针异常抛出入口的实现如下: { C ...

  9. Go版本管理--go.sum

    目录 1. 简介 2. go.sum文件记录 3. 生成 4.校验 5.校验和数据库 1. 简介 为了确保一致性构建,Go引入了go.mod文件来标记每个依赖包的版本,在构建过程中go命令会下载go. ...

  10. 闭包 panic recover

    闭包=函数+外层变量的引用 recover必须搭配defer使用 defer一定要在可能引发panic的语句之前定义