Laravel 队列重复执行同一个任务

我在laravel中使用队列执行任务,任务的逻辑大体是循环插入数据(这里我就要说一下了,循环里面最好不要执行插入/修改操作)。

这是大体代码:
$data=array(这是数据);
foreach ($data as $key => $value) {
    //这里是判断数据是否已存在
    //code....


    $table1 = new Table1;
    $table1->field1=$value['field1'];
    $table1->field2=$value['field2'];
    if($table1->save()){
        $table2 = new Table2;
        $table2->table1_id=$table1->id;
        $table2->field1=$value['field3'];
        $table2->field2=$value['field4'];
        $table2->save();
    }
}

但是我发现插入到数据库里的数据有大量重复的数据。(注释:我用的redis驱动队列)

我查看队列执行日志,发现是因为我任务的执行时间太长,导致任务过期,重新把任务放到队列里面,然后问题就出来了,我超时的任务并没有停止掉,而我新放到队列里的任务也在执行,这就导致有两个队列在同时执行一个任务。

我查看了文档发现,有这么一个东西:

注:参数项 --timeout 的值应该始终小于配置项 retry_after 的值,这是为了确保队列进程总在任务重试以前关闭。如果 --timeoutretry_after 大,那么你的任务可能被执行两次。

然后我就去检查了我的参数设置,我的--timeout为500,而retry_after才90,怪不得会重复执行

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 1
wuchenge

哎呀,今天也碰到了这个问题。

``` --timeout 600 ``

retry_after 是默认值,导致任务失败后一直执行,然后日志被写满,很可能是这个原因

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!