workerman开发过程中遇到的一些常见的问题与解决方法

文章来自:微信公众号 - PHP 自学中心


个人笔记:在 workerman 开发过程中,遇到了很多问题,我都总结了一下,与大家分享。如果你在实战中有不懂的,建议去看看这套教程,希望能帮助到你!

ThinkPHP5 与 workerman 实战 — 在线客服
链接:www.mano100.cn/thread-158-1-1.html

workerman 无法正常访问#

问题描述:在阿里云 ECS 上部署了 workerman 的应用(ECS 是专有网络),在 ECS 安全组里已经允许 workerman 需要的全部端口,但是外网一直不能正常打开(注,其他服务,比 80 端口外部是可以用访问的)。telnet 连接显示 “No route to host”,而且我是关闭了 centos7firewalld 防火墙的,这让我很困惑。

问题原因:
因为对 centos7 了解不多,关闭 firewalld.service 后,并没有关闭 iptable.service 导致的。

解决问题:
1、安全组入方向,设置 workerman 的端口范围;
2、关闭 firewalld 防火墙和修改 /etc/sysconfig/iptables 规则。

workerman 不能关闭怎么办#

问题描述:启动脚本里执行 Worker::stopAll() 并不能停止 workerman,Worker::stopAll() 只有在运行 workerman 的主进程里执行才有效,外部其它进程执行没有效果。

停止 Workerman 的流程是
1、找到 Workerman 主进程 pid
2、给 pid 发送 SIGINT 信号 (posix_kill(SIGINT, pid))
3、workerman 主进程收到 SIGINT 信号后自身执行 Worker::stopAll() 完成服务停止。

这三个步骤 workerman 内部应封装好,调用流程是
1、设置 $argv = 'stop';
2、运行 Worker::runAll();

3 workerman 可以一直运行么
workerman 可以一直运行,以 daemon(守护进程)方式启动 workerman 即可后台一直运行。

启动停止 workerman
启动
debug(调试)方式启动

php start.php start

daemon(守护进程)方式启动

php start.php start -d

停止

php start.php stop

重启

php start.php restart

平滑重启

php start.php reload

查看状态

php start.php status

debugdaemon 方式区别:
1、以 debug 方式启动,代码中 echovar_dumpprint 等打印函数会直接输出在终端。
2、以 daemon 方式启动,代码中 echovar_dumpprint 等打印会默认重定向到 /dev/null 文件,可以通过设置 Worker::$stdoutFile = '/your/path/file'; 来设置这个文件路径。
3、以 debug 方式启动,终端关闭后 workerman 会随之关闭并退出。
4、以 daemon 方式启动,终端关闭后 workerman 继续后台正常运行。

workerman 无法 socket 怎么办#

Workerman 是一款纯 PHP 开发的开源高性能的 PHP socket 服务器框架。被广泛的用于手机 app、手游服务端、网络游戏服务器、聊天室服务器、硬件通讯服务器、智能家居、车联网、物联网等领域的开发。但是在配置 workerman 情况下,不免有些意想不到的错误,下面小编整理网上资料并整合自身遇到的问题,给出以下几种常用的解决方案。

问题描述:
现象 1
启动后报错类似如下:

php start.php start
PHP Warning:  stream_socket_server(): unable to connect totcp://xx.xx.xx.xx:xxxx (Address already in use) 
in /home/workerman-chat/Workerman/Worker.php on line xxxx

关键字:Address already in use

失败原因:端口被占用,无法启动。
可以通过命令 netstat -anp | grep 端口号来找出哪个程序占用了端口。
然后停止对应的程序释放端口解决。

如果不能停止对应端口的程序,可以通过更换 workerman 的端口解决。
如果是 Workerman 占用的端口,又无法通过 stop 命令停止 (一般是丢失 pid 文件或者主进程被开发者 kill 了导致),可以通过运行以下两个命令杀死 Workerman 进程。

`kill all php
ps aux|grep WorkerMan|awk '{print $2}'|xargs kill -9`

现象 2
启动后报错类似如下:

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

关键字:Cannot assign requested address

失败原因:
启动脚本 ip 参数写错,不是本机 ip,请填写本机 ip 机或者填写 0.0.0.0(表示监听本机所有 ip)即可解决。

提示:Linux 系统可以通过命令 ifconfig 查看本机所有网卡 ip

如果您是腾讯云用户,注意您的公网 ip 实际是代理服务器 ip,公网 ip 并不属于你的服务器,所以无法通过公网 ip 绑定,但是可以通过 0.0.0.0 来绑定。

现象 3
启动后报错类似如下:

Waring stream_socket_server has been disabled **for**security reasons in...

失败原因:
stream_socket_server 函数被 php.ini 禁用

解决方法
1、运行 php --ini 找到 php.ini 文件
2、打开 php.ini 找到 disable_functions 一项,将 stream_socket_server 禁用项删掉

现象 4
启动后报错类似如下:

PHP Warning:  stream_socket_server(): unable to connect to tcp://0.0.0.0:xxx (Permission denied)

失败原因
linux 下监听端口如果小于 1024,需要 root 权限。

解决办法
使用大于 1024 的端口或者使用 root 用户启动服务。

现象 5
启动后报错类似如下:

WebSocket connection to 'ws://x.x.x.x:2346/'failed: 
Error in connection establishment:net::ERR_NAME_NOT_TIMED_OUT

失败原因
服务器防火墙挡住了设置的端口,这里于 2346 为例。

解决办法
进入 Linux vim 编辑服务器防火墙文件,添加你需要开发的服务器端口保存后重启防火墙。

[root@iZwz9xxxxxxxxxxxxxxxxxx conf]# iptables -nvl #查看允许访问的端口
[root@iZwz9xxxxxxxxxxxxxxxxxx conf]# vim /etc/sysconfig/iptables #编辑
[root@iZwz9xxxxxxxxxxxxxxxxxx conf]# /etc/init.d/iptables restart #重启

workerman 无法监听怎么办#

问题描述:根据手册一步一步走下来,但是发现在启动监听的时候,发生了错误:

[thinkexceptionThrowableError]
Fatal error: Call to undefined **function**WorkermanLibpcntl_signal()

本地运行环境:win10+php7, 已经用 composer 下载了 workerman-for-win

解决办法:
如果是在 windows 下面 composer 安装的话,在文档第一步 composer **require**topthink/think-worker
的时候,它还会顺带下载 workerman/workerman,但是因为是在 windows下面运行,所以要删除掉 workerman/workerman,再进行下一步。workerman/workerman-for-win`

这时,你再启动监听就可以了!

本作品采用《CC 协议》,转载必须注明作者和本文链接
程序员的福利:免费获取 JetBrains 全家桶激活码 推荐:【点击这里获取 。。。激活码适用:AppCode, CLion, DataGrip, DataSpell, dotCover, dotMemory, dotTrace, goland, IntelliJ IDEA Ultimate, phpstorm, pycharm, ReSharper
Laravel00
讨论数量: 1

问一下 线上部署 workerman 这种常驻内存的应用,如何进行监控的? 比如 阿里云 的 ARMS, 可以直接无缝监控 php-fpm 的应用 但不知道这种常驻内存的应用,是否也能无缝监控

3年前 评论

资深程序猿 @ XX科技
文章
62
粉丝
37
喜欢
255
收藏
588
排名:282
访问:3.3 万
私信
所有博文
社区赞助商