Php解压pako,Swoole WebSoctet 使用 zlib 压缩之 PHP 与 pako.js

一些理论知识

先说一下deflate算法吧,deflate是zip压缩文件的默认算法, 其实deflate现在不光用在zip文件中, 在7z, xz等其他的压缩文件中都用, 实际上deflate只是一种压缩数据流的算法,任何需要流式压缩的地方都可以用。

也就是说 zlib 格式, gzip 格式,是文件格式,deflate 是这些文件格式使用的压缩算法。

传输方式

deflate 压缩后是二进制,通常有两种传输方式:

  • 二进制
  • Base64编码

二进制

PHP

// 压缩,注意:其中 ZLIB_ENCODING_DEFLATE 参数是不能少的

$data = gzdeflate(json_encode($array, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), 6, ZLIB_ENCODING_DEFLATE);

// 使用 swoole 以二进制的方式发送

$webSocket->push($fd, $data, WEBSOCKET_OPCODE_BINARY);

JavaScript

// 消息事件

ws.onmessage = function(e) {

// 转换前

console.log(e.data);

// 开始转换

var blob = e.data;

var reader = new FileReader();

reader.readAsBinaryString(blob);

reader.onload = function (evt) {

var data = pako.inflate(evt.target.result, { to: 'string' })

// 转换后

console.log(JSON.parse(data))

};

};

Base64编码

通常在 WebSoctet 不会使用这种方法,但是在接口或其他文本传输中会使用到。

PHP + JavaScript

<script type='text/javascript'>

const compressedDEFLATE = '<?php echo base64_encode(gzdeflate('Compress me', 6, ZLIB_ENCODING_DEFLATE )); ?>';

function atos(arr) {

for (var i=0, l=arr.length, s='', c; c = arr[i++];)

s += String.fromCharCode(

c > 0xdf && c < 0xf0 && i < l-1

? (c & 0xf) << 12 | (arr[i++] & 0x3f) << 6 | arr[i++] & 0x3f

: c > 0x7f && i < l

? (c & 0x1f) << 6 | arr[i++] & 0x3f

: c

);

return s

}

console.log(atos(pako.ungzip(atob(compressedDEFLATE))));

</script>

Swoole WebSoctet 框架

安利一个基于 Swoole 的 WebSoctet 开发框架: MixPHP

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值