Workerman自定义协议不直接返回响应,而是由onMessage业务逻辑调用$connection->send()触发协议encode方法编码后发送;协议只需实现input、decode、encode三个静态方法,专注编解码。

Workerman 5.2.3 中自定义协议本身不直接“返回响应”,而是通过协议的 encode 方法将业务数据转换为可发送的字节流,再由连接对象($connection->send())发出。响应数据的生成和传递,完全由你的业务逻辑(如 onMessage 回调)控制,协议只负责编解码。
协议类只需专注三件事:input、decode、encode
你写的协议类(例如 MyProtocol)必须提供三个静态方法:
- input($buffer):判断当前接收缓冲区是否凑够一个完整包。返回包长(>0)、0(继续等)、或 false/-1(断连)。
- decode($buffer):对已截取的完整包做解析,返回业务层能直接用的数据(比如数组、对象)。
-
encode($data):把业务层要发出去的
$data(比如['code'=>0, 'msg'=>'ok'])转成二进制格式(如 JSON + 换行、或带包头的二进制流)。
响应数据由 onMessage 决定,不是协议决定
当客户端发来数据,Workerman 自动完成:
收包 → 调 input → 截包 → 调 decode → 得到 $data → 触发 onMessage($connection, $data)。
此时,你要在 onMessage 里处理业务,并调用 $connection->send() 发送响应:
- 传入的参数是原始业务数据(
$data是decode返回的结果); -
$connection->send($responseData)会自动调用你协议的encode方法; - 最终发给客户端的是
encode($responseData)的返回值。
常见 encode 实现示例(JSON+换行)
假设你协议按换行分包,encode 就是序列化加换行:
namespace Workerman\Protocols;class JsonNL {
public static function encode($buffer) {
return json_encode($buffer, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . "\n";
}
}
那么你在 onMessage 里这样写就能发响应:
Workerman 会自动调用 JsonNL::encode(...),把数组变成 {"status":"success","data":{"id":123}}\n 发出去。
注意:不要在 encode 里做业务逻辑或异步操作
encode 必须是纯函数:输入确定,输出确定,无副作用、无 IO、不 await、不 sleep。所有数据库查询、HTTP 请求、鉴权校验等,都应在 onMessage 或更下层业务方法中完成,然后把结果传给 send()。

















