gateway_client 连接 workerman的时候会不定时的出现 getAllGatewayAddressesFromRegister fail.

tufei

我遇到一个问题,gateway_client 连接 workerman的时候会不定时的出现 这个错误,

[attach]597[/attach]

我抓包发现是register 主动发了rst包,

[attach]596[/attach]

这种情况怎么处理比较好?

下面是我thinkphp5 里面 bind 的代码

[attach]599[/attach]

---==================================------------
【群主】walkor(2202055656) 18:18:12
网络问题?
【群主】walkor(2202055656) 18:18:46
gateway_client 和 gatewayWorker是本机么?本机的话用127.0.0.1
【活跃】jocke(185291445) 18:24:22
是本机,
【群主】walkor(2202055656) 18:24:50
本机用127.0.0.1 ,这样不走网卡试下
【活跃】jocke(185291445) 18:24:53
但是考虑后面可能会起多台gateway worker
【活跃】jocke(185291445) 18:25:20
好的,
【群主】walkor(2202055656) 18:25:25
对了,你是不是使用了ReactPHP?
【活跃】jocke(185291445) 18:25:41
稍等,我看下
【群主】walkor(2202055656) 18:25:52
php start.php status 看看
【活跃】jocke(185291445) 18:26:11

[attach]598[/attach]

【活跃】jocke(185291445) 18:26:25
是有reactphp
【群主】walkor(2202055656) 18:26:49
有用reactPHP的组件没?
【群主】walkor(2202055656) 18:26:58
可以去掉reactphp不?
【活跃】jocke(185291445) 18:27:01
暂时没有
【活跃】jocke(185291445) 18:27:44
后面有个业务需要在wm里面调其他地方接口,我就加了这个,暂时没用上,我先去掉试试
【群主】walkor(2202055656) 18:28:22
嗯,去掉就好了
【群主】walkor(2202055656) 18:28:31
我看看是怎么回事
【活跃】jocke(185291445) 18:28:45
这是啥原理?
【活跃】jocke(185291445) 18:29:02
我在写问答了,呆会发上去,给后面其他人做参考

阅读 4556
6个回答

walkor

是reactPHP react/event-loop的bug,
https://github.com/reactphp/event-loop/issues/42
定时器不精确,导致register服务提前关闭了链接。
它们主干已经修复,但是composer安装的版本没有修复。

解决办法:
1、更新reactphp/event-loop主干的代码
2、不使用ReactPHP
3、安装libevent扩展或者event扩展(这个bug只有在没装这两个扩展的时候才会触发)

  • 暂无评论
tufei

谢谢拉

  • 暂无评论
notcry

@walkor 您好

我也出现和楼主同样的问题。

我是阿里云的Cent OS服务器。PHP 7.2.26, ThinkPHP5.1,用composer安装了GatewayClient

我在Linux中的crontab有个每一分钟执行的计划任务,任务中调用的PHP文件的代码是通过Gateway::sendToGroup()给一个组推送消息,成功和失败都记录日志,查日志的话,经常性的会出现“Gateway::getAllGatewayAddressesFromRegister() with registerAddress:"127.0.0.1:1238"”。
成功和失败的概率是1:2左右。

在这个时候,我执行php start.php status 查看,
event-loop对应的值是“\Workerman\Events\Select”

我按照您提的第三点,给PHP安装了event扩展。
这时执行php start.php status查看,
event_loop对应的值变成了“\Workerman\Events\Event”

本以为安装event之后就会搞定此问题,结果发现没有什么变化。还是会出现同样的情况。

您还有什么思路吗? 请给予指点,非常感谢~~ !!

  • 暂无评论
walkor

@notcry
出现这个问题后运行 php start.php status 截图下

  • 暂无评论
notcry

截图时间为10:45左右。

感谢大神关注。 截图时间是10:45左右,这个时间点前后的日志如下:

[2021-06-18T10:33:01+08:00][info] heartbeat success : 2021-06-18 10:33:01 : 
[2021-06-18T10:34:01+08:00][info] heartbeat fail : 2021-06-18 10:34:01 : Gateway::getAllGatewayAddressesFromRegister() with registerAddress:"127.0.0.1:1238"  return array (
)
[2021-06-18T10:35:01+08:00][info] heartbeat fail : 2021-06-18 10:35:01 : Gateway::getAllGatewayAddressesFromRegister() with registerAddress:"127.0.0.1:1238"  return array (
)
[2021-06-18T10:36:01+08:00][info] heartbeat fail : 2021-06-18 10:36:01 : Gateway::getAllGatewayAddressesFromRegister() with registerAddress:"127.0.0.1:1238"  return array (
)
[2021-06-18T10:37:01+08:00][info] heartbeat fail : 2021-06-18 10:37:01 : Gateway::getAllGatewayAddressesFromRegister() with registerAddress:"127.0.0.1:1238"  return array (
)
[2021-06-18T10:38:02+08:00][info] heartbeat fail : 2021-06-18 10:38:02 : Gateway::getAllGatewayAddressesFromRegister() with registerAddress:"127.0.0.1:1238"  return array (
)
[2021-06-18T10:39:01+08:00][info] heartbeat success : 2021-06-18 10:39:01 : 
[2021-06-18T10:40:01+08:00][info] heartbeat success : 2021-06-18 10:40:01 : 
[2021-06-18T10:41:01+08:00][info] heartbeat success : 2021-06-18 10:41:01 : 
[2021-06-18T10:42:01+08:00][info] heartbeat fail : 2021-06-18 10:42:01 : Gateway::getAllGatewayAddressesFromRegister() with registerAddress:"127.0.0.1:1238"  return array (
)
[2021-06-18T10:43:01+08:00][info] heartbeat fail : 2021-06-18 10:43:01 : Gateway::getAllGatewayAddressesFromRegister() with registerAddress:"127.0.0.1:1238"  return array (
)
[2021-06-18T10:44:01+08:00][info] heartbeat success : 2021-06-18 10:44:01 : 
[2021-06-18T10:45:02+08:00][info] heartbeat fail : 2021-06-18 10:45:02 : Gateway::getAllGatewayAddressesFromRegister() with registerAddress:"127.0.0.1:1238"  return array (
)
[2021-06-18T10:46:01+08:00][info] heartbeat fail : 2021-06-18 10:46:01 : Gateway::getAllGatewayAddressesFromRegister() with registerAddress:"127.0.0.1:1238"  return array (
)
[2021-06-18T10:47:01+08:00][info] heartbeat fail : 2021-06-18 10:47:01 : Gateway::getAllGatewayAddressesFromRegister() with registerAddress:"127.0.0.1:1238"  return array (
)
  • 暂无评论
notcry

  • walkor 2021-06-18

    你的gateway进程一直在报错,已经报错了13万次了。debug方式运行(启动时不加-d)看下报错,解决下就好了。

  • walkor 2021-06-18

    猜测是配置问题

  • notcry 2021-06-18

    谢谢,按照您的提示,查到报错是:
    stream_socket_server(): unable to connect to tcp://127.0.0.1:2900 (Address already in use) in /www/wwwroot/我的域名/vendor/GatewayWorker/vendor/workerman/workerman/Worker.php on line 2255

    端口还有 2901 2902 2903

  • notcry 2021-06-18

    是我有什么其他项目占用了 2900 ~ 2903吗?

  • notcry 2021-06-18

    请教walkor, 我搜到了 https://wenda.workerman.net/question/3842?answer_id= 是应该按照这个帖子里边提到的 http://doc.workerman.net/appendices/kernel-optimization.html 进行linux内核调优的工作吗?

  • notcry 2021-06-18

    继续搜索,找到了。 https://eyunzhu.com/1302.html 您觉得是这个问题吗 ?

  • walkor 2021-06-18

    Address already in use是端口被占用了。netstat -lnp | grep 2900 看下是哪个进程占用了端口

  • notcry 2021-06-18

    tcp 0 0 127.0.0.1:2900 0.0.0.0:* LISTEN 6853/WorkerMan: wor

  • notcry 2021-06-18

    我被自己绕晕了。

  • notcry 2021-06-18

    https://www.workerman.net/download/GatewayWorker.zip 压缩包中 \GatewayWorker\Applications\YourApp\start_gateway.php文件中
    有这样一行
    $gateway->startPort = 2900;
    但他上边的注释是:
    // 内部通讯起始端口,假如$gateway->count=4,起始端口为4000
    // 则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口

    这里应该没有动过。 是不是跟这有关系??

  • notcry 2021-06-18

    我把上边提到的 $gateway->startPort = 2900; 改成 $gateway->startPort = 4000; start 不在报错了。 status的话Register的exit_count 也是0 不过看日志 和最初的日志一致。 还是基本上1:2的成功和失败。

  • notcry 2021-06-18

    我在crontab中写了两个计划,凌晨1点stop 凌晨1:02start
    0 1 路径/php 路径/start.php stop
    2 1
    路径/php 路径/start.php start -d

    是不是这个计划任务 启动的workerman 和我白天终端登录上去 stop strat的workerman不是一回事。
    因为我刚刚终端上去 php start.php stop 之后 。 业务没受影响。 日志还是正常在记录。 百思不得其解。

  • notcry 2021-06-18

    我刚刚执行 php start.php status
    结果是:
    Workerman[start.php] status
    Workerman[start.php] not run
    但业务还在正常跑。 日志还在正常出......

  • walkor 2021-06-18

    应该是有其他gatewayWorker服务在跑。运行ps auxf 把其他gatewayWorker kill掉