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 扩展。