我有一个调度工作,每次调用一个函数。这个函数做了很多事情,可能会抛出异常或给我一个错误。
这是在一个循环中完成的,所以如果发生错误,该函数会停止工作并被卡住,直到我删除导致错误的条目(或修复错误)。
这样的事情:
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-尝试到处抓住
我知道他们两个都会工作,但我想知道是否有另一种方式。
答案 0 :(得分:1)
最好的解决方案是找出流程崩溃并解决此问题的原因。 您可以编写一些处理错误的代码,将问题存储在数据库中并跳过文档直到问题得到解决。
否则,我相信您的第一个解决方案将是分离不同文档处理的最佳方式。你的代码也会更清晰 尝试捕获只会堵塞你的代码。
答案 1 :(得分:1)
在命令中使用命令的缺点是你不能从中获得那么多。实际上,您可以在初始命令中运行代码并以这种方式捕获错误。
您可以实现的替代解决方案是在单独的分叉流程中从循环内部运行代码,例如使用symfony/process或duncan3dc/fork-helper。
对于与您类似的用例,已经成功实现了这两者,这实际上取决于您的内在逻辑的作用。如果代码可以同时运行,那么分支过程可以使主进程保持活动状态。
如果你测试一下这个小提示,请务必检查数据库连接等。这些通常在分叉期间丢失。