workman在什么情况下会触发$worker->onClose函数,有几种情况?

哆啦2B梦

除去如下情况:
1.接收消息主动调用
2.对端异常断开
3.数据库链接异常

4679 5 0
5个回答

walkor

根据手册 http://doc.workerman.net/315149

当客户端连接与Workerman断开时触发的回调函数。不管连接是如何断开的,只要断开就会触发onClose。每个连接只会触发一次onClose。

只有这一种情况,客户端与workerman链接断开时。

  • 暂无评论
哆啦2B梦

谢谢@walkor
目前我这网络打不开新版手册,我再通过其它方法试试
我还有一个问题,目前这个函数是作为客户端在$con =new AsyncTcpConnection中的
在里这个有以下方法:

$con->onConnect,
$con->onMessage,
$con->onError,
$con->onClose=function($con){
    $con->reConnect(0.1);
}

在触$con->onClose发生重连后我这边$con->onConnect中有几个Timer::add会再在原来的基础上再起一遍,按照这样情况是不是所有的回调函数都是又重复调用一遍而不是重新初始化调用啊?

  • 暂无评论
walkor

不懂你说什么

  • 暂无评论
哆啦2B梦

我再描述一下,
1我实例化了一个异步链接,
2然后在实例中的onConnect回调函数中设置若干个计时器,
3在onClose回调中写了reConnect

在调用onClose后希望reConnect重新链接,
现在出现的情况是链接重新建立起来了,但是onConnect中的计时器再起了一遍,等于说是计时器变成双份了

  • 暂无评论
walkor

这个属于业务逻辑问题了,
你可以给链接做个标记,加定时器的时候判断下这个标记,没有的话加定时器并设置标记,有的话就说明加过了,就不再加了。

例如

$con->onConnect = function($con) {
// 链接是个php对象,可以随时动态添加属性的,这里给这个链接加个timer_added属性记录是否加过定时器
if (empty($con->timer_added)) {
Timer::add(...);
$con->timer_added = true;
}
};
或者在onClose的时候关闭之前的定时器。

$con->onConnect = function($con) {
$con->timer_id = Timer::add(...);
};
$con->onClose = function($con) {
Timer::del($con->timer_id);
};

  • 暂无评论
年代过于久远,无法发表回答
🔝