一、安装扩展:composer require topthink/think-queue
注:tp6对应的think-queue版本为3.0以上,不然队列监听启动不了(会报错)
二、配置redis连接(redis自行下载安装,这里用phpstudy来配置redis)
1.在项目目录下vendor/topthink/think-queue/config.php内容复制到config/queue.php(没有queue.php文件自行创建);
return [
'default' => 'redis',
'connections' => [
'sync' => [
'type' => 'sync',
],
'redis' => [
'type' => 'redis',
'queue' => 'default',
'host' => '127.0.0.1',
'port' => 6379,
'password' => '',
'select' => 0,
'timeout' => 0,
'persistent' => false,
],
],
'failed' => [
'type' => 'none',
'table' => 'failed_jobs',
],
];
三 、创建消费者控制器(所谓的消费者就是删除队列更新数据的操作:先进后出)
1.app/job/TimeoutOrder.php 创建消费者控制器 TimeoutOrder切不用就继承任何基类
消费者:
class TimeoutOrder
{
/**
* 队列消费者入口
* @param Job $job
* @param $data
* @return void
*/
public function fire(Job $job, $data)
{
$result = $this->toJob($data);
if ($result) {
$job->delete(); // 删除该任务
} else {
$job->release(2);
}
}
/**
* 订单超时 数据恢复
* @param $data
* @return bool
*/
public function toJob($data)
{
// 更新商品订单状态
Db::startTrans();
try {
// 1.代码逻辑
if ($result["code"] == 1) {
echo "执行成功";
Log::write('TimeoutOrder执行成功了');
return true;
} else {
echo "执行失败";
Log::write('TimeoutOrder执行失败了');
return false;
}
}
public function failed($data)
{
// ...任务达到最大重试次数后,失败了
}
}
四、生产者:在订单生成时就将该订单信息添加到redis有序队列中
// 队列生产者 订单超时监听队列
$consumer_time = 1800; // 半个小时,1800秒
$jobHandlerClassName = 'app\job\TimeoutOrder'; // 消费者路径
$jobData = ['order_id'=>$orderResult->id]; // 订单ID,这里可以放自己想放的数据
$jobQueueName = 'order_timeout'; // 队列名称
$result = Queue::later($consumer_time, $jobHandlerClassName, $jobData, $jobQueueName);//参数1:时间,,参数2:路径,参数3:业务参数,参数4:队列名称
if ($result === false) { // 加入队列失败
}
五、在终端开启队列监听
1.php think queue:listen --queue // 监听所有队列
2.php think queue:listen --queue order_timeout // 监听指定队列+队列名称