Karp 的技术博客

今天业务上需要对接下 其他站点 的 websocket 服务.

坑不少 之前 B平台 对接遇到个 ping&pong 包的问题 Webscocket pong 包 php 踩坑实例

今天对接 O平台 发现官方的demo 没有我大PHP. 太过分了~

新来的同学通过golang demo 找到 golangcompress/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]);

php

版权属于:karp
作品采用:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
更新于: 2019年11月26日 02:12
6

目录

来自 《`Websocket` 数据解压缩踩坑》