thinkphp-queue在使用过程中 遇到的一个教训

栏目: PHP · 发布时间: 6年前

内容简介:在项目中我们使用了适合于关于 thinkphp-queue 的使用可以见这个网址我遇到的问题 就是因为一个配置 当我们在

在项目中我们使用了适合于 thinphp5 的队列 thinphp-queue version v1.1.5 。 正常执行没有问题,但是每隔一段时间就会有很多任务重试。经过排查发现是一个配置的问题。具体可以进入本文来查看一些事项。

关于 thinkphp-queue 的使用可以见这个网址 thinkphp-queue 笔记

我遇到的问题 就是因为一个配置 当我们在 thinkphpapplication 应用目录下创建一个 extra/queue.php 时 我们一般这样创建

return [
    'connector' => 'Database',   // 数据库驱动
        'expire'    =>60,           // 任务的过期时间,默认为60秒; 若要禁用,则设置为 null
        'default'   => 'pic',    // 默认的队列名称
        'table'     => 'jobs',       // 存储消息的表名,不带前缀
//        'dsn'       => [],
];

我天真的以为这个任务过期时间时自动删掉任务的结果不是。

结果通过 \think\queue\connector\Database::pop 这个方法的一个判断得到这样的结果

if (!is_null($this->options['expire'])) {
    $this->releaseJobsThatHaveBeenReservedTooLong($queue);
}

\think\queue\connector\Database::releaseJobsThatHaveBeenReservedTooLong 方法是这样写的(请注意:这个方法是 protected 所以无法在类外部直接调用)

protected function releaseJobsThatHaveBeenReservedTooLong($queue)
    {
        $expired = time() - $this->options['expire'];

        $this->db->name($this->options['table'])
            ->where('queue', $this->getQueue($queue))
            ->where('reserved', 1)
            ->where('reserved_at', '<=', $expired)
            ->update([
                'reserved'    => 0,
                'reserved_at' => null,
                'attempts'    => ['inc', 1]
            ]);
    }

如果过期时间不是 null , 那么就重新将任务更新为未执行任务。

于是我悲哀的任务重复执行来了。。。

所以如果你的任务只执行一次,且你想保留任务的话可以将这个设置项 expire 设置为 null


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

GOOGLE HACKS

GOOGLE HACKS

Rael Dornfest、Tara Calishain / 卞军、谢伟华、朱炜 / 电子工业 / 2006-1 / 49.00元

GOOGLE HACKS巧妙使用网络搜索的技巧和工具(第二版)一起来看看 《GOOGLE HACKS》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

SHA 加密
SHA 加密

SHA 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具