九步排查 Gateway-Worker 启动失败问题
Workerman 是一款开源高性能异步 PHP socket 即时通讯框架。支持高并发,超高稳定性,被广泛的用于手机 app、移动通讯,微信小程序,手游服务端、网络游戏、PHP 聊天室、硬件通讯、智能家居、车联网、物联网等领域的开发。 支持 TCP 长连接,支持 Websocket、HTTP 等协议,支持自定义协议。拥有异步 Mysql、异步 Redis、异步 Http、MQTT 物联网客户端、异步消息队列等众多高性能组件。
环境
1. CentOS 7.0
2.ThinkPHP 5.1
3.Workman 3.5.20
问题
1. ThinkPHP5.1 以后,不能将 vendor 中的包(workman 也在其中)复制后直接使用里面的类,在项目刚搭建的时候可以将需要的包写在 composer.json 中后 composer install,或者 composer require flc/dysms 等。
2. workman 安装成功,基本的业务功能也写完了,进入服务器找到项目的根目录,输入 php think worker:gateway -d,或者 php think worker:gateway start。
3. 可能启动成功,输入 php think worker:gateway status 查看进程的信息。
4. 服务端成功后,上面"websocket://0.0.0.0:9502“ 在客户端如果连接出现 ”WebSocket connection to 'ws://x.x.x.x:2346/' failed: Error in connection establishment:net::ERR_NAME_NOT_TIMED_OUT“,表示防火墙拦住了设置的端口。
方法:如果 CentOS 安装了宝塔面板,安全->添加端口->放行。如果使用命令添加,最后 firewall-cmd reload 命令重启防火墙即可。
5. 启动成功,客户端通过 websocket 连接也没有报错,但就是发送消息过来,后端的 Events 中 OnMessage 事件一直接收不到消息。问题就有可能就是 Events 文件中有语法错误或者什么异常。
方法:去 vendor 文件夹中找到 workman 的 workman.log,查看错误的地方在哪里再修改即可解决。
6. 如果启动后出现 PHP Warning: stream_socket_server(): unable to connect to tcp://xx.xx.xx.xx:xxxx (Address already in use) in /home/workerman-chat/Workerman/Worker.php on line xxxx
方法:通过命令 netstat -anp | grep 端口号来找出哪个程序占用了端口,然后关闭对应程序释放端口。
7. 如果启动后出现 Waring stream_socket_server has been disabled for security reasons in ...
方法:找到运行的 PHP 版本的 php.ini ,禁用函数 stream_socket_server 去除,宝塔操作如下。
8. 如果启动后出现 PHP Warning: stream_socket_server(): unable to connect to tcp://0.0.0.0:xxx (Permission denied)
方法:使用大于 1024 的端口或者使用 root 用户启动服务。
9. PHP Warning: stream_socket_server(): unable to connect to tcp://xx.xx.xx.xx:xxx (Cannot assign requested address) in /home/GatewayWorker/Workerman/Worker.php on line xxxx
方法:启动脚本 ip 参数写错,不是本机 ip,请填写本机 ip 机或者填写 0.0.0.0(表示监听本机所有 ip)即可解决。提示:Linux 系统可以通过命令 ifconfig 查看本机所有网卡 ip。如果您是腾讯云用户,注意您的公网 ip 实际是代理服务器 ip,公网 ip 并不属于你的服务器,所以无法通过公网 ip 绑定,但是可以通过 0.0.0.0 来绑定。
评论