Skip to content

workerman 开发者必须知道的几个问题

1、windows 环境限制

windows 系统下 workerman 单个进程仅支持 200 + 个连接。 windows 系统下无法使用 count 参数设置多进程。 windows 系统下无法使用 status、stop、reload、restart 等命令。 windows 系统下无法守护进程,cmd 窗口关掉后服务即停止。 windows 系统下无法在一个文件中初始化多个监听。 linux 系统无上面的限制,建议正式环境用 linux 系统,开发环境可以选择用 windows 系统。

2、workerman 不依赖 apache 或者 nginx

workerman 本身已经是一个类似 apache/nginx 的容器,只要 PHP 环境 OKworkerman 就可以运行。

3、workerman 是命令行启动的

启动方式类似 apache 使用命令启动 (一般网页空间无法使用 workerman)。启动界面类似下面

4、长连接必须加心跳

长连接必须加心跳,长连接必须加心跳,长连接必须加心跳,重要的话说三遍。 长连接长时间不通讯会被路由节点清理导致连接关闭。 workerman 心跳说明gatewayWorker 心跳说明

5、客户端和服务端协议一定要对应才能通讯

这个是开发者非常常见的问题。例如客户端是用 websocket 协议,服务端必须也是 websocket 协议 (服务端 new Worker('websocket://0.0.0.0...') ) 才能连得上,才能通讯。 不要尝试在浏览器地址栏访问 websocket 协议端口,不要尝试用 webscoket 协议访问裸 tcp 协议端口,协议一定要对应。

这里的原理类似如果你要和英国人交流,那么要使用英语。如果要和日本人交流,那么要使用日语。这里的语言就类似与通讯协议,双方 (客户端和服务端) 必须使用相同的语言才能交流,否则无法通讯。

6、连接失败可能的原因

刚开始使用 workerman 时很常见的一个问题是客户端连接服务端失败。 原因一般如下: 1、服务器防火墙 (包括云服务器安全组) 阻止了连接 (50% 几率是这个) 2、客户端和服务端使用的协议不一致 (30% 几率) 3、ip 或者端口写错了 (15% 的几率) 4、服务端没启动

7、不要使用 exit die sleep 语句

业务执行 exit die 语句会导致进程退出,并显示 WORKER EXIT UNEXPECTED 错误。当然,进程退出了会立刻重启一个新的进程继续服务。如果需要返回,可以调用 return。sleep 语句会让进程睡眠,睡眠过程中不会执行任何业务,框架也会停止运行,会导致该进程的所有客户端请求都无法处理。

8、不要使用 pcntl_fork 函数

pcntl_fork 用来动态创建新的进程,如果在业务代码中使用 pcntl_fork ,它可能会产生无法回收孤儿进程,导致业务出现异常。业务中 pcntl_fork 还会影响连接、消息、连接关闭、定时器等事件的处理,导致不可预知的异常。

9、业务代码里不要有死循环

业务代码里不要有死循环,否则会导致控制权无法交还给 workerman 框架,导致无法接收处理其它客户端消息。

10、改代码要重启

workerman 是常驻内存的框架,改代码要重启 workerman 才能看到新代码的效果。

11、长连接应用建议用 GatewayWorker 框架

很多开发者使用 workerman 是要开发长连接应用,例如即时通讯、物联网等,长连接应用建议直接使用 GatewayWorker 框架,它专门在 workerman 的基础上再次封装,做起长连接应用后台更简单、更易用。

12、支持更高并发 如果业务并发连接数超过 1000 同时在线,请务必优化 linux 内核,并安装 event 扩展

基于 MIT 许可发布