使用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 受影響?
問題一
沒問題
問題二:進程進入方式
需要自己測試驗證,根據你提供的資訊無法給出建議
感謝版大的建議