我有一个调度程序,它运行一个作业来处理 400 个对象的数组,并且我使用 foreach 循环来迭代该数组并对每个对象执行计算。然而我注意到迭代从未完成。 当它达到第 100 - 110 次迭代之间的某个位置时,不会继续进行下一次迭代,而是重复该作业,并从数组的索引 0 开始迭代。
我在本地机器上尝试了这个,它运行良好,它成功地迭代了整个数组并执行了所有代码,但在 ubuntu 服务器上从来没有运行过。
public function handle()
{
try {
foreach ($objects as $object) {
//do something
//compare something
$someGroups = $object->certainProperty;
foreach ($somegroups as $group) {
//do some calculation and comparison
}
$members = $object->certainMembersArray;
//insert members to DB
}
} catch (\Exception $e) {
//log exception
}
}
有趣的是,它永远不会进入 catch 块并记录任何错误或异常,这使得调试变得困难。起初我怀疑是内存问题,所以我增加了内存,但没有任何区别。
有人可以建议我可以做什么来进一步调查这个问题吗?
更新:
您的作业在服务器上似乎超时。尝试更改队列或作业本身的超时值。本地机器通常比小型实例/Droplet 更快。
您可以在启动队列时设置超时值,如下所示,
默认超时时间为:60 秒
$ php artisan queue:work --timeout=120
或者您可以在作业中添加超时,
<?php
namespace App\Jobs;
class ProcessObjectsJob implements ShouldQueue
{
/**
* The number of seconds the job can run before timing out.
*
* @var int
*/
public $timeout = 120;
}