2017-05-31 111 views
0

我有一個每次調用函數的計劃作業。這個函數做了很多事情,可能會拋出異常或給我一個錯誤。Laravel取得日程安排作業

這是在一個循環中完成的,所以如果發生錯誤,該函數將停止工作並被刪除,直到我刪除導致錯誤的條目(或修復錯誤)。

事情是這樣的:

public function process_documents() 
{ 
$documents = document::where("processed", 0)->get(); 

foreach($documents as $document) 
{ 
$this->do_this($document); 
$this->do_that($document); 
$this->finish($document); 
} 

} 

的解決方案,我雖然:

1-做一個執行命令的命令。

foreach($documents as $document) 
{ 
Artisan::call("document:process",$document->id); 
} 

2-嘗試捕捉無處不

我知道他們都將工作,但我想知道是否有另一種方式。

回答

1

最好的解決方案是找出過程崩潰的原因並解決這個問題。 您可以編寫一些處理錯誤的代碼,將問題存儲在數據庫中並跳過文檔,直到問題解決。

否則,我相信你的第一個解決方案將是分開處理不同文檔的最好方法。你的代碼也會更乾淨。
嘗試捕獲只會阻塞你的代碼。

+0

當然,我每次都會修復它,但我不想在上午04:00保姆生產,因爲意外墜毀了。特別是當我不是項目中的onyl工作人員時。 – prgrm

+0

這是個好建議。儘管我認爲'try/catch'塊有其目的和地點。 @prgrm也提到這個功能做了很多。研究問題的分離,並將其分解爲更小,更易於管理的功能。 – fubar

+1

我同意一個嘗試/抓住每個文件找到問題就沒問題。但正如我所理解的那樣,他希望增加對每一個功能的嘗試。 – Jerodev

0

在命令中使用命令的缺點是你不會從中獲得太多的收益。實際上,您可以在初始命令中運行代碼並以這種方式捕獲錯誤。

您可以實現的替代解決方案是在單獨的分叉進程中從循環內運行代碼,例如使用symfony/processduncan3dc/fork-helper

實現了這兩個成功的類似於你的用例,這實際上取決於你的內在邏輯是幹什麼的。如果代碼可以同時運行,分叉過程可以讓你的主進程保持活躍狀態​​。

一個小提示,如果你測試了這一點,一定要檢查數據庫連接等,這些通常在分岔過程中丟失。