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
”,而且我是关闭了centos7
的firewalld
防火墙的,这让我很困惑。
问题原因:
因为对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
debug
和daemon
方式区别:
1、以debug
方式启动,代码中echo
、var_dump
、print
等打印函数会直接输出在终端。
2、以daemon
方式启动,代码中echo
、var_dump
、print
等打印会默认重定向到/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 协议》,转载必须注明作者和本文链接
问一下 线上部署workerman这种常驻内存的应用,如何进行监控的? 比如 阿里云 的 ARMS,可以直接无缝监控 php-fpm的应用 但不知道这种常驻内存的应用,是否也能无缝监控