安装think-queue
composer require topthink/think-queue
我这边是使用在自动确认订单方面
/**
* 接单
*/
public function receivingOrder()
{
$user_id = $this->auth->id;
$this->checkIdentity();
$oid = input('oid',0,'intval');
if (!$oid) $this->error('订单不存在');
$orderData = Order::where('id',$oid)->find();
if (!$orderData) $this->error('订单不存在');
if ($orderData->status != 0) $this->error('此单已被抢走了');
Db::startTrans();
try{
//修改订单
$orderData->consumer_id = $user_id;
$orderData->status = 1;
$orderData->save();
//加入司机订单
OrderConsumer::insert([
'oid' => $oid,
'consumer_id' => $user_id,
'order_status' => 0,
'createtime' => time(),
]);
// 当前任务由哪个类负责处理
$job_handler_classname = "app\job\job\ProductCheckOrder";
// 当前队列归属的队列名称
$job_queue_name = "product_order";
// 当前任务所需的业务数据
$job_data = ["order_id"=>$oid , 'user_id'=>$user_id];
$time = Db::name('config')->where('name','auto_order_check')->value('value');
$times = (int)$time*60;
// 将任务推送到消息队列等待对应的消费者去执行
$is_pushed = Queue::later($times,$job_handler_classname, $job_data, $job_queue_name);
if($is_pushed === false){
throw new Exception('自动确认订单队列失败');
}
Db::commit();
}catch (\Exception $e){
Db::rollback();
$this->error('接单失败');
}
$this->success('接单成功,等待车主确认订单');
}
自行建立队列 下面是队列代码 , 有点乱 , 小项目 , 懒得优化了
class ProductCheckOrder
{
/**
* 车主自动确认订单
*/
public function fire(Job $job, $data){
$oid = $data['order_id'];
$user_id = $data['user_id'];
if (!$oid || !$user_id){
$job->delete();
return false;
}
$order = Db::name('order')->where(['consumer_id'=>$user_id , 'id'=>$oid ,'status'=>1,'product_confirm'=>0])->find();
$order_consumer = Db::name('order_consumer')->where(['consumer_id'=>$user_id , 'oid'=>$oid,'order_status'=>0])->order('id desc')->find();
if (!$order || !$order_consumer){
$job->delete();
}
$res=0;
Db::startTrans();
try{
$res1 = Db::name('order')->where('id',$order['id'])->update(['product_confirm'=>1]);
$res2 = Db::name('order_consumer')->where('id',$order_consumer['id'])->update(['order_status'=>1]);
if (!$res1 || !$res2){
throw new Exception('失败');
}
$res = 1;
Db::commit();
}
catch (\Exception $e){
Db::rollback();
}
if ($res == 1) {
//如果任务执行成功, 记得删除任务
$job->delete();
}else{
if ($job->attempts() > 3) {
//通过这个方法可以检查这个任务已经重试了几次了
$job->delete();
}else{
$job->release(2); //$delay为延迟时间,表示该任务延迟2秒后再执行
}
}
}
下面是启动队列 , 在项目根目录下使用 php think queue:work --queue product_order 注意 , 不要加daemon , 毕竟开发时需要调整 , 否则会不断的 ps -apn 和kill -9
接下来使用swoole去完成消息推送
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?