2017-05-31 115 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

实现了这两个成功的类似于你的用例,这实际上取决于你的内在逻辑是干什么的。如果代码可以同时运行,分叉过程可以让你的主进程保持活跃状态​​。

一个小提示,如果你测试了这一点,一定要检查数据库连接等,这些通常在分岔过程中丢失。