使用Laravel 架設(shè) gateway workerman
情境:目前每分鐘有排程會倒數(shù)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
問題二:進(jìn)程進(jìn)入方式
啟動這個timer的方式,是透過client socket 傳送封包到指定方法例如:StartGame()的方式進(jìn)入循環(huán)排程,因為這個方法是會一直遞迴也有加lock在方法內(nèi)。但是這樣這個進(jìn)程是否會受到client端影響而造成不穩(wěn)定?
目前有想採用task方法來執(zhí)行StartGame方法讓其進(jìn)行遞迴,使其不受client端影響導(dǎo)致這個線程受影響,是否這個方法會比較可行?麻煩大大協(xié)助分析
延伸問題
之所以會探討這個問題是因為,我有其他laravel task 因為有業(yè)務(wù)邏輯error 導(dǎo)致socket排程中斷
是否只是因為業(yè)務(wù)邏輯error進(jìn)而導(dǎo)致workerman 受影響?