您当前的位置: 首页 > 

苗先生的PHP记录

暂无认证

  • 4浏览

    0关注

    190博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

运用supervisor管理thinkqueue 和swoole推送

苗先生的PHP记录 发布时间:2021-07-07 15:37:42 ,浏览量:4

安装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去完成消息推送
            
关注
打赏
1665468453
查看更多评论
0.3971s