class Event
{
public static $timer_id;
public static function onMessage($client_id, $message)
{
switch($message_data)
{
case 're_login': //登錄時(shí)創(chuàng)建定時(shí)器
$time_interval =60;
self::$timer_id = \Workerman\Lib\Timer::add($time_interval, function(){
//要執(zhí)行的邏輯
var_dump(111);
Gateway::sendToClient(...)//給對(duì)應(yīng)的房間對(duì)應(yīng)的客戶端發(fā)送一條隨機(jī)消息
}
return;
}
}
public static function onClose($client_id)
{
\Workerman\Lib\Timer::del(self::$timer_id);//客戶端退出時(shí)清除定時(shí)器
}
}
代碼貌似錯(cuò)了,當(dāng)客戶端退出時(shí)無(wú)法清除定時(shí)器??刂婆_(tái)到時(shí)間照樣輸出111。大神們幫忙解決一下唄。
1、businessWorker是多進(jìn)程的,客戶端發(fā)來(lái)的請(qǐng)求默認(rèn)是gateway隨機(jī)轉(zhuǎn)發(fā)給businessWorker處理,
也就是創(chuàng)建定時(shí)器的進(jìn)程和運(yùn)行onClose刪除定時(shí)器的進(jìn)程不是同一個(gè)進(jìn)程,會(huì)導(dǎo)致刪除定時(shí)器失敗。
解決方法:設(shè)置gateway到businessWorker的路由,讓同一個(gè)客戶端的請(qǐng)求都轉(zhuǎn)發(fā)給某個(gè)固定的businessWorker進(jìn)程,可以直接使用gatewayWorker手冊(cè)路由
http://workerman.net/gatewaydoc/gateway-worker-development/router.html
中的范例 2 隨機(jī)綁定來(lái)達(dá)到這一目的。
2、按照樓主需求,定時(shí)器id $timer_id 不能放在類的靜態(tài)常量中,因?yàn)檫@樣不管有多少各客戶端設(shè)置了定時(shí)器,這里的值只有一個(gè),也就是只保存了最后一個(gè)定時(shí)器的$timer_id ,前面的都被覆蓋了。
解決方法:將定時(shí)器的$timer_id 存儲(chǔ)在$_SESSION中
GatewayWorker $_SESSION參見(jiàn)手冊(cè) http://workerman.net/gatewaydoc/gateway-worker-development/session.html
public static function onMessage(..)
{
...
case 're_login': //登錄時(shí)創(chuàng)建定時(shí)器
$_SESSION = \Workerman\Lib\Timer::add(...
...
}
public static function onClose(..)
{
\Workerman\Lib\Timer::del($_SESSION);
}
最后建議帶著需求把手冊(cè)多看幾遍再來(lái)寫(xiě)程序,可以大大加快開(kāi)發(fā)速度