故事背景是这样的. 我要接入某安的 webscocket推送服务, 但这个服务要求接到ping后10分钟内必须返回一个pong 包.
因为之前没用过php 的 ping-pong 包, 所以以为pong 就是 send 字符串 pong 就可以了, 某安的文档中也没有 pong包示例.
我同事帮我查询 资料
ping
和 pong
:WebSockets
的心跳
在握手之后客户端或服务端都可以选择向另一方发送ping
。收到ping
消息后,接受者必须尽快发回pong
消息。您可以使用此方式来确保客户端仍处于连接状态。
ping
和 pong
只是一个常规的消息帧,但它是一个 管理帧. ping
的 opcode
为 0x9
,pong
的 opcode
为 0xA
。当你得到ping消息,回复一个pong消息, 带有完全相同的数据(对于ping
和pong
,最大数据长度为125字节
).可能在你没法ping
的时候也能收到pong
消息 ,这种情况下直接忽略就可以了.
如果在你回pong
消息之前你收到了不止一个ping
消息, 那么你只用回一个pong
消息即可.
code 处理如下:
ping
包格式 因为是对象类型 所以使用 serialize
序列化
2019/11/07 17:16:53 | 6440 0 Pong s O:26:"Swlib\Saber\WebSocketFrame":4:{s:6:"finish";b:1;s:6:"opcode";i:9;s:4:"data";s:13:"1573118213940";s:2:"fd";i:0;}
ping
包 opcode
为 0x9
十进制的 9
pong
包 opcode
为 0xA
十进制的 10
self::$websocket->push('pong', 10, true);
我这个 pong
是不规范的 应该是 $data->data
的数据原路 push
回去.