Skip to content

workerman 启动失败

现象 1

启动后报错类似如下:

php
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

根本原因:端口被占用,无法启动。

解决方案 1

可以通过命令 netstat -anp | grep 端口号 来找出哪个程序占用了端口。 然后停止对应的程序释放端口解决。

解决方案 2

如果不能停止对应端口的程序,可以通过更换 workerman 的端口解决。

解决方案 3

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

killall php
ps aux|grep -i workerman|awk '{print $2}'|xargs kill -9

解决方案 4

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

解决方案 5

检查程序是否开启了 reusePort,关闭 reusePort 试下。

现象 2

启动后报错类似如下:

php
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 来绑定。

现象 3

php
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
PHP Warning:  stream_socket_server(): unable to connect to tcp://0.0.0.0:xxx (Permission denied)

失败原因

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

解决办法

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

基于 MIT 许可发布