除去如下情況:
1.接收消息主動(dòng)調(diào)用
2.對(duì)端異常斷開(kāi)
3.數(shù)據(jù)庫(kù)鏈接異常
根據(jù)手冊(cè) http://doc.workerman.net/315149
當(dāng)客戶端連接與Workerman斷開(kāi)時(shí)觸發(fā)的回調(diào)函數(shù)。不管連接是如何斷開(kāi)的,只要斷開(kāi)就會(huì)觸發(fā)onClose。每個(gè)連接只會(huì)觸發(fā)一次onClose。
只有這一種情況,客戶端與workerman鏈接斷開(kāi)時(shí)。
謝謝@walkor
目前我這網(wǎng)絡(luò)打不開(kāi)新版手冊(cè),我再通過(guò)其它方法試試
我還有一個(gè)問(wèn)題,目前這個(gè)函數(shù)是作為客戶端在$con =new AsyncTcpConnection中的
在里這個(gè)有以下方法:
$con->onConnect,
$con->onMessage,
$con->onError,
$con->onClose=function($con){
$con->reConnect(0.1);
}
在觸$con->onClose發(fā)生重連后我這邊$con->onConnect中有幾個(gè)Timer::add會(huì)再在原來(lái)的基礎(chǔ)上再起一遍,按照這樣情況是不是所有的回調(diào)函數(shù)都是又重復(fù)調(diào)用一遍而不是重新初始化調(diào)用啊?
我再描述一下,
1我實(shí)例化了一個(gè)異步鏈接,
2然后在實(shí)例中的onConnect回調(diào)函數(shù)中設(shè)置若干個(gè)計(jì)時(shí)器,
3在onClose回調(diào)中寫(xiě)了reConnect
在調(diào)用onClose后希望reConnect重新鏈接,
現(xiàn)在出現(xiàn)的情況是鏈接重新建立起來(lái)了,但是onConnect中的計(jì)時(shí)器再起了一遍,等于說(shuō)是計(jì)時(shí)器變成雙份了
這個(gè)屬于業(yè)務(wù)邏輯問(wèn)題了,
你可以給鏈接做個(gè)標(biāo)記,加定時(shí)器的時(shí)候判斷下這個(gè)標(biāo)記,沒(méi)有的話加定時(shí)器并設(shè)置標(biāo)記,有的話就說(shuō)明加過(guò)了,就不再加了。
例如
$con->onConnect = function($con) {
// 鏈接是個(gè)php對(duì)象,可以隨時(shí)動(dòng)態(tài)添加屬性的,這里給這個(gè)鏈接加個(gè)timer_added屬性記錄是否加過(guò)定時(shí)器
if (empty($con->timer_added)) {
Timer::add(...);
$con->timer_added = true;
}
};
或者在onClose的時(shí)候關(guān)閉之前的定時(shí)器。
$con->onConnect = function($con) {
$con->timer_id = Timer::add(...);
};
$con->onClose = function($con) {
Timer::del($con->timer_id);
};