weiphp队列插件的用法

简述

因为当前项目需求,不想使用第三方的队列服务,于是花了一晚上时间写了一个简单的队列。
队列服务对外公开一个url,用户可以通过系统定时器定期访问url来做到实时处理。

未尽事宜(视业务需求开发):

  • [ ] 列表页数据需要格式化
  • [ ] 实现对数据库的切换
  • [ ] 实现对失败数据的消息推送,发微信消息还是什么。。。 TBD
  • [x] 使用事务来处理状态变化

    插件配置

    队列插件有一个设置项,是否允许优先级。默认为是。这么设置的原因是为了兼容某些队列要立即执行的需求。如果没有必要请保持开启状态。

    如何将数据加入到队列中

    在控制其中对外公开了一个叫做addQueue($data)的方法。这个方法需要一个数组作为参数。格式大体如下。 update@20170110 应使用场景,有可能同时对一条数据的多个字段更改,故以二维数组方式传入值,但仍要确保每个字数组只做更改一个字段
1
2
3
4
5
6
7
8
9
10
11
12
$data=[
[
'target_database'=>'要设置的数据库',
'target_table'=>'要修改的数据表名',
'target_field'=>'要修改字段名',
'target_value'=>'要设置的值',
'target_id'=>'要修改目标id',
'expire_time'=> 12342342,
'token'=>'公众号归属',
'level'=>0,
]
];

字段说明

  1. target_database 目标数据库 未实现此功能,当前仅能对当前数据库进行处理,后期可能会增加dsn字段实现跨服务器跨库操作。
  2. target_tables 目标数据表
  3. target_field 目标字段
  4. target_id 目标数据
  5. target_value 要将目标数据表目标数据的目标字段改为哪个值,未兼容,此处队列数据表中设置了varchar(255)。理论上是够用了。
  6. token 是为了以后兼容针对单用户执行。添加当前绑定的公众号,可通过get_token()获取。
  7. level是优先级,可选项为101优先,写入到数据表后再下次定时器执行时被处理。0普通,只有到过期时间时才被处理。
  8. expire_time 本条数据执行时间,或者说这条数据的到期时间。当level为1是设置过期时间不起作用。

调用方法

可以通过new的方法

1
2
$controller=new \Addons\Queue\Controller\QueueConttoller();
$return = $controller->addQueue($data);

直接执行理论也是可以的

1
$return =\Addons\Queue\Controller\QueueConttoller::addQueue($data);

返回值说明

返回值为int|bool

  1. 成功时返回int 数值即为队列序号
  2. 失败时返回false

    执行方法

    手动执行

    可以通过通过
1
\Addons\Queue\Controller\QueueConttoller::addQueue($data)

来手动执行。

1
2
3
4
5
6
7
8
$data=[
'id'=>1,//queue表id, 如果存在id 则自动忽略下面其他的数据
'target_table'=>'要修改的数据表名',
'target_field'=>'要修改字段名',
'target_database'=>'要设置的数据库 未实现此功能',
'expire_time'=>12341423,//过期时间
'target_id'=>'要修改目标id'
]

数据说明

$datakey`id与其他几个是互斥的。 就是说你要么只传递id,要么不传递id。 除id`外,其他几个可以只传一个值,但是这可能会造成数据安全。因为你只传递一个值或者少量的几个值时,数据搜索的结果并不精准,你不能保证你不需要的数据不出现处理列表中。

自动执行

自动执行只能针对过期时间进行处理。

优先级执行

不论自动执行还是手动执行,当开启了优先级时,都会先处理优先级的数据。

队列删除

update@20170110 应场景 增加删除机制 所有删除为假删除,标记状态为 -2
删除方法delQueue($data),传入数组$data可以使用thinkphp的where数组方式,请不要传递字符串,虽然字符串可能也会执行。

下载地址

下载插件
  • Post author: hainuo
  • Post link: weiphp_queue_usage
  • Copyright Notice: All articles in this blog are licensed under BY-NC-SA unless stating additionally.