分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 教程案例

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

发布时间:2023-09-06 02:22责任编辑:沈小雨关键词:jsPHPWeb

一些理论知识

先说一下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

原文地址:https://segmentfault.com/a/1190000016547663

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

原文地址:https://www.cnblogs.com/lalalagq/p/9969021.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved