tinywan/rpc插件是最轻量、最贴合Webman运行模型的RPC方案,无需修改框架底层、不依赖注册中心,适用于中小规模微服务或模块解耦;服务端需严格配置namespace与实际类命名空间一致(含末尾反斜杠)及text://0.0.0.0:端口格式的listen_text_address,客户端推荐使用TinywanClient封装类而非手写socket,并确保参数为数组、返回值可JSON序列化。

直接说结论:用 tinywan/rpc 插件是最轻量、最贴合 Webman 运行模型的方案,不用改框架底层,也不依赖注册中心,适合中小规模微服务或模块解耦场景。
服务端配置必须对齐命名空间和监听地址
很多人启动后客户端连不上,第一反应是防火墙或端口占用,其实 90% 是配置错在 config/plugin/tinywan/rpc/app.php 的两个关键项:
-
namespace必须和你实际服务类的命名空间完全一致(注意末尾反斜杠),比如服务类路径是app pcUser,这里就得写'namespace' => 'app\rpc\';写成service\却把类放在app/rpc/下,就会报{"code":404,"msg":"接口调用类不存在"} -
listen_text_address值格式为text://0.0.0.0:8889,不能写成tcp://...或漏掉text://前缀,否则服务根本不会监听该端口 - 确认服务已真正启动:执行
php start.php start -d后,检查日志里是否有RPC server started on text://0.0.0.0:8889字样,没有说明插件没加载或配置未生效
客户端别手写 socket,优先用 TinywanClient
原始 socket 示例虽然能跑通,但每次都要处理连接、超时、重试、错误解析,容易出错。插件自带的 TinywanClient 类已经封装好这些逻辑:
Webman 2.2.0版本强化了 TCP/UDP 服务支持,优化路由组管理,并增强异步任务处理能力。结合协程与连接池技术,Webman 能轻松应对高并发场景,适用于网站、接口服务、即时通讯、物联网及游戏开发,兼具高性能、灵活扩展与稳定可靠,是多场景 PHP 服务开发的理想选择。
- 构造时传入完整地址,如
new TinywanClient('tcp://127.0.0.1:8889'),注意协议必须是tcp://(服务端用text://,客户端用tcp://) -
request()方法自动加换行符、处理响应截断、兼容空响应,比手写fgets($client, 10240000)更稳 - 如果遇到
Connection refused,先用telnet 127.0.0.1 8889测试端口是否通,不通就不是代码问题,而是服务没起来或被防火墙拦截
参数传递和返回值类型要严格匹配
tinywan/rpc 默认走 JSON 文本协议,不支持资源句柄、闭包、PDO 实例等 PHP 特有类型:
- 服务端方法接收的
$args一定是数组,即使客户端只传一个字符串,也得包成['uid' => 123],不能直接传123 - 服务端返回必须是可 JSON 序列化的结构,
response_rpc_json(0, 'ok', $model->toArray())安全,response_rpc_json(0, 'ok', $model)会因对象不可序列化而返回空或 500 错误 - 客户端收到的
$res是纯数组,不是对象,别试图调用$res->id,要用$res['id']
最常被忽略的是服务类的自动加载路径和命名空间一致性——Webman 不会自动扫描 service/ 目录,它只认你在配置里写的 namespace,哪怕文件物理位置对了,命名空间写错一个字符,就会静默失败返回 404。调试时第一件事就是 var_dump(class_exists('app\rpc\User')) 确认类能否被正确加载。

















