与你们分享一下,在workerman开发中遇到的问题与解决方法

在workerman开发过程当中,遇到了不少问题,我都总结了一下,与你们分享:若是还不懂的,建议去看看这套教程,但愿能帮助到你!

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


1  workerman没法正常访问
问题描述:在阿里云ECS上部署了workerman的应用(ECS是专有网络),在ECS安全组里已经容许workerman须要的所有端口,可是外网一直不能正常打开(注,其余服务,比80端口外部是能够用访问的)。telnet链接显示“No route to host”,并且我是关闭了centos7的firewalld防火墙的,这让我很困惑。

问题缘由:
由于对centos7了解很少,关闭firewalld.service后,并无关闭iptable.service致使的。

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

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

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

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

3  workerman没法使用怎么办
问题描述:启动后报错相似以下:php start.php starthtml

PHP Warning: stream_socket_server(): unable to connect to tcp://xx.xx.xx.xx:xxxx (Address already in use) 
in ...workerman/Worker.php on line xxxx
关键字: Address already in use


失败缘由:端口被占用,没法启动。
能够经过命令netstat -anp | grep 端口号来找出哪一个程序占用了端口。而后中止对应的程序释放端口解决。

若是不能中止对应端口的程序,能够经过更换workerman的端口解决。

若是是Workerman占用的端口,又没法经过stop命令中止(通常是丢失pid文件或者主进程被开发者kill了致使),能够经过运行如下两个命令杀死Workerman进程。linux

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


若是确实没有程序监听这个端口,那么多是开发者在workerman里设置了两个或两个以上的监听,而且监听的端口相同致使,请开发者自行检查启动脚本是否监听了相同的端口。vim


现象2
启动后报错相似以下:windows

PHP Warning: stream_socket_server(): unable to connect to tcp://xx.xx.xx.xx:xxx (Cannot assign requested address) in ...
workerman/Worker.php on line xxxx

或者centos

PHP Warning: stream_socket_server(): unable to connect to tcp://xx.xx.xx.xx:xxxx (在其上下文中,该请求的地址无效) 
in ...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监听。虽然不能用公网ip监听,可是仍然能够经过0.0.0.0来绑定。安全


现象3服务器

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


失败缘由:
stream_socket_server 函数被php.ini禁用

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


现象4php7

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


失败缘由
linux下监听端口若是小于1024,须要root权限。

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

4 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方式区别:
一、以debug方式启动,代码中echo、var_dump、print等打印函数会直接输出在终端。
二、以daemon方式启动,代码中echo、var_dump、print等打印会默认重定向到/dev/null文件,能够经过设置Worker::$stdoutFile = '/your/path/file';来设置这个文件路径。
三、以debug方式启动,终端关闭后workerman会随之关闭并退出。
四、以daemon方式启动,终端关闭后workerman继续后台正常运行。



5 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禁用

解决方法
一、运行php --ini 找到php.ini文件
二、打开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 #重启


6  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

这时,你再启动监听就能够了!

相关文章
相关标签/搜索