關於Timer進入方式

horskin

问题描述

使用Laravel 架設 gateway workerman
情境:目前每分鐘有排程會倒數60秒
程式碼如下

public static function StartGame()
    {
        Gateway::$registerAddress = '127.0.0.1:1236';
        $GameData = PowerSystemCache::Get_Status();
        if(!$GameData['status']){
            //deal flag
                ...
            $time = 60;
            $stage_message = array('status'=>true,'action'=>'CountDown','flag'=>$flag,"count_time"=>$time,'time' => date('Y-m-d H:i:s'));
            for($i=1;$i<=$time;$i++) {
                $t = $i;
                $timer = Timer::add($i, function() use ($room_type,$stage_message,$time,$t){
                    $stage_message["timer"] = $time - $t;
                    Gateway::sendToGroup($room_type, json_encode($stage_message));
                },null,false);
            }

            $newt_timer = Timer::add(60, function() use($room_type,$flag){
                PowerSystemCache::Set_Status(false,$flag);
                self::EndGame($flag);
                //end game
                $stage_message = array('status'=>true,'action'=>'EndGame','time' => date('Y-m-d H:i:s'));
                Gateway::sendToGroup($room_type, json_encode($stage_message));
                self::StartGame();
            },null,false);
            PowerSystemCache::Set_Status(true,$flag);
        }
        return;
    }

此timer在每60秒後會遞迴

方案探討

問題一
首先想先詢問這樣實作timer的方式會不會有問題?因為是一次生成60個timer分別從60s~0s

問題二:進程進入方式

目前方法

啟動這個timer的方式,是透過client socket 傳送封包到指定方法例如:StartGame()的方式進入循環排程,因為這個方法是會一直遞迴也有加lock在方法內。但是這樣這個進程是否會受到client端影響而造成不穩定?

方法二

目前有想採用task方法來執行StartGame方法讓其進行遞迴,使其不受client端影響導致這個線程受影響,是否這個方法會比較可行?麻煩大大協助分析

延伸問題
之所以會探討這個問題是因為,我有其他laravel task 因為有業務邏輯error 導致socket排程中斷
是否只是因為業務邏輯error進而導致workerman 受影響?

434 1 0
1个回答

walkor

問題一
沒問題

問題二:進程進入方式
需要自己測試驗證,根據你提供的資訊無法給出建議

年代过于久远,无法发表回答
🔝