使用GatewayWorker,在Events類中需要實現(xiàn):
4進(jìn)程,在一個多用戶房間內(nèi),服務(wù)器設(shè)定一個定時器,20秒后取消。但是還剩下15秒的時候,服務(wù)器需要取消該定時器。調(diào)用Timer::del($timer_id)后仍然會執(zhí)行。
請問如何實現(xiàn)“定時器添加和刪除放在同一個進(jìn)程”?
場景:
一個房間有6個人,6回合你畫我猜。10秒選詞,60秒畫,5秒答案展示。
10秒選詞:
選詞開始,設(shè)定10秒定時器,告知大家當(dāng)前回合的題目。如果用戶1在5秒的時候選詞了,就要清除這個定時器。如果10秒后用戶未選詞,系統(tǒng)自動選詞(定時器內(nèi)自動清除,這個沒問題)
添加定時器后得到timerid 存起來 然后當(dāng)你收到用戶選詞的消息后 刪除這個timerid。這個方法嘗試過吧timerid存在數(shù)據(jù)庫,讀取出來清除,但是不成功。
可能過程中,設(shè)定定時器和5秒時消除定時器不在一個進(jìn)程,所以總是清除不成功……
定時器里讀下數(shù)據(jù)庫里的timeid是否存在,存在的話就運(yùn)行,不存在就刪除自己。
也就是刪除定時器改成刪除數(shù)據(jù)庫里的timerid
問題的原因應(yīng)該就是你說的,刪除定時器跟創(chuàng)建定時器不在同一個進(jìn)程。每個進(jìn)程的 timer id 是各自獨(dú)立分配的。
可以開一個進(jìn)程專門用于處理定時器邏輯,所有的 BusinessWorker 跟這個進(jìn)程通信,發(fā)出需要創(chuàng)建、刪除定時器的指令(可以用房間號來標(biāo)識定時器),如果定時器未刪除而觸發(fā),就通知所有 BusinessWorker 做該做的事。