2017-02-28 267 views
0

我有以下的(簡單)鎖定爲Laravel 5.3命令代碼:清理控制檯命令

private $hash = null; 
public final function handle() { 
    try { 
     $this->hash = md5(serialize([ static::class, $this->arguments(), $this->options() ])); 
     $this->info("Generated signature ".$this->hash,"v"); 

     if (Redis::exists($this->hash)) { 
      $this->hash = null; 
      throw new \Exception("Method ".$this->signature." is already running"); 
     }    
     Redis::set($this->hash, true);          
     $this->info("Running method","vv"); 
     $this->runMutuallyExclusiveCommand(); //Actual command is not important here 
     $this->cleanup(); 
    } catch (\Exception $e) { 
     $this->error($e->getMessage()); 
    } 
} 

public function cleanup() { 
    if (is_string($this->hash)) { 
     Redis::del($this->hash); 
    } 
} 

指令是否允許通過其執行週期通常也能正常工作(包括處理時有一個PHP例外)。然而,當通過其他方式(例如,CTRL-C或終端窗口關閉)中斷命令時會出現問題。在這種情況下,清理代碼不會運行,並且該命令被認爲仍然是「正在執行」,所以我需要手動從緩存中刪除條目以重新啓動它。我試圖運行在__destruct功能cleanup代碼,但似乎並沒有被任何調用。

我的問題是,有沒有設置一些代碼的方式當命令終止它不管如何終止跑出?

回答

1

簡短的回答是否定的。當你殺死正在運行的進程時,無論是通過Ctrl-C還是關閉終端,都可以終止它。你需要在你的shell中有一個連接到你的清理代碼的中斷,但這是超出範圍的。

還有其他的選擇的。可以間歇運行Cron作業來執行清理任務和其他有用的事情。您也可以創建一個在當前代碼之前運行的啓動例程。當你執行啓動例程時,它可以爲你做清理,然後調用你當前的例程。我相信你最好的選擇是使用一個cron作業,它按給定的時間間隔運行,然後查找不再合適的緩存中的條目,然後清理它們。這裏是一個不錯的網站,以幫助您開始使用cron作業https://www.linux.com/learn/scheduling-magic-intro-cron-linux

+0

我不認爲一個cron是合適的,因爲我不知道該緩存條目是否存在因爲任務被殺害或因爲任務仍在運行。但我願意承認答案確實不是。 – apokryfos