page contents

workerman开发遇到的问题与解决方法

workerman无法正常访问问题描述:在阿里云ECS上部署了workerman的应用(ECS是专有网络),在ECS安全组里已经允许workerman需要的全部端口,但是外网一直不能正常打开(注,其他服务,比80端口外...

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();


workerman无法使用怎么办
问题描述:启动后报错类似如下:php start.php start

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进程。killall php
ps aux|grep WorkerMan|awk '{print $2}'|xargs kill -9
如果确实没有程序监听这个端口,那么可能是开发者在workerman里设置了两个或两个以上的监听,并且监听的端口相同导致,请开发者自行检查启动脚本是否监听了相同的端口。现象2
启动后报错类似如下:

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

或者

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来绑定。现象3Waring 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禁用项删掉现象4PHP Warning: stream_socket_server(): unable to connect to tcp://0.0.0.0:xxx (Permission denied)
失败原因
linux下监听端口如果小于1024,需要root权限。
解决办法
使用大于1024的端口或者使用root用户启动服务。
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 startPHP 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


关键字: Address already in use
失败原因:端口被占用,无法启动。
可以通过命令netstat -anp | grep 端口号来找出哪个程序占用了端口。
然后停止对应的程序释放端口解决。
如果不能停止对应端口的程序,可以通过更换workerman的端口解决。
如果是Workerman占用的端口,又无法通过stop命令停止(一般是丢失pid文件或者主进程被开发者kill了导致),可以通过运行以下两个命令杀死Workerman进程。

`killall phpps 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
​​​​​​​
这时,你再启动监听就可以了!

  • 发表于 2020-03-02 15:35
  • 阅读 ( 578 )
  • 分类:PHP开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1470 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章