今天业务上需要对接下 其他站点 的 websocket 服务.
坑不少 之前 B平台 对接遇到个 ping&pong 包的问题 Webscocket pong 包 php 踩坑实例
今天对接 O平台 发现官方的demo 没有我大PHP. 太过分了~
新来的同学通过golang demo
找到 golang
中compress/flate
包 这篇文章找到下面内容:
维基百科给出的解释是:DEFLATE是同时使用了LZ77算法
与哈夫曼编码
(Huffman Coding)的一个无损数据压缩算法。它最初是由菲尔·卡茨(Phil Katz)为他的PKZIP
软件第二版所定义的,后来被RFC 1951
标准化。
通过 百度 搜索 PHP DEFLATE
数据压缩算法 内容如下:
LZ77
: 是一种基于字典的无损数据压缩算法(还有 LZ78, LZW 等)
deflate
: 也是一种数据压缩算法,实际上就是先用 LZ77 压缩,然后用霍夫曼编码压缩
gzip
: 是一种文件结构,也可以算一种压缩格式,通过 defalte 算法压缩数据,然后加上文件头和adler32校验
zlib
: 是一个提供了 deflate, zlib, gzip 压缩方法的函数库;也是一种压缩格式(用 deflate 压缩数据,然后加上 zlib 头和 CRC 校验)
代码示例 我处理了一下 :
<?php
$string = "11aa@#@23123szadler32adler32adler32f..adler32adler32";
$level = 9;
echo "字符串长度:", strlen($string), PHP_EOL;
$zlib = gzcompress($string, $level);
echo "gzcompress 压缩后长度:", strlen($zlib), PHP_EOL;
/*
78da 3334 4c4c 7450 7630 3236 3432 2eae
4a4c c949 2d32 3642 a5d2 f4f4 5005 00a7
2c10 93
*/
$src_zlib = substr($zlib, 2, -4);
echo "zlib还原: " . gzinflate($src_zlib);
内容实际上很多. 3中压缩方式 我就只是挑了对我有用的一种 gzinflate
. O平台 的 ws 解压 通过 gzinflate
函数解压即可.
PHP中存在一组看起来很像的压缩解压函数:
压缩函数:gzcompress gzdeflate gzencode
解压函数:gzuncompress gzinflate gzdecode
!!! 追加一个坑 线上 swoole v4.2.11
websocket_mask
由于RFC规定, v4.4.0后此配置默认开启, 但会导致性能损耗, 如服务器端无强制要求可以设置false关闭
WebSocket客户端启用或关闭掩码。默认为关闭。启用后会对WebSocket客户端发送的数据使用掩码进行数据转换。
$http->set(['websocket_mask' => true]);