Events::onClose
說明:
void Events::onClose(string $client_id);
客戶端與Gateway進(jìn)程的連接斷開時(shí)觸發(fā)。不管是客戶端主動(dòng)斷開還是服務(wù)端主動(dòng)斷開,都會(huì)觸發(fā)這個(gè)回調(diào)。一般在這里做一些數(shù)據(jù)清理工作。
注意:onClose回調(diào)里無法使用Gateway::getSession()
來獲得當(dāng)前用戶的session數(shù)據(jù),但是仍然可以使用$_SESSION
變量獲得。
注意:onClose回調(diào)里無法使用Gateway::getUidByClientId()
接口來獲得uid,解決辦法是在Gateway::bindUid()
時(shí)記錄一個(gè)$_SESSION['uid']
,onClose的時(shí)候用$_SESSION['uid']
來獲得uid。
注意:斷網(wǎng)斷電等極端情況可能無法及時(shí)觸發(fā)onClose
回調(diào),因?yàn)檫@種情況客戶端來不及給服務(wù)端發(fā)送斷開連接的包(fin包),服務(wù)端就無法得知連接已經(jīng)斷開。檢測這種極端情況需要心跳檢測,并且必須設(shè)置$gateway->pingNotResponseLimit>0
。這種斷網(wǎng)斷電的極端情況onClose將被延遲觸發(fā),延遲時(shí)間為小于$gateway->pingInterval*$gateway->pingNotResponseLimit
秒,如果$gateway->pingInterval
和 $gateway->pingNotResponseLimit
中任何一個(gè)為0,則可能會(huì)無限延遲。
參數(shù)
$client_id
全局唯一的client_id
返回值
無返回值,任何返回值都會(huì)被視為無效的
范例
use \GatewayWorker\Lib\Gateway;
class Events
{
...
/**
* 當(dāng)用戶斷開連接時(shí)觸發(fā)的方法
* @param integer $client_id 斷開連接的客戶端client_id
* @return void
*/
public static function onClose($client_id)
{
// 廣播 xxx logout
GateWay::sendToAll("client[$client_id] logout\n");
}
...
}