乐趣区

关于消息队列:thinkphp5的消息队列详细教程

音讯队列的概念、原理和场景

在高并发的时候,程序往往无奈做到及时的解决。咱们引入一个两头的零碎,来进行分流和减压。

所以从实质上讲:音讯队列就是一个队列构造的中间件。也就是说,你把音讯和内容放入这个容器之后就能够间接返回,不必等它前期解决的后果。另外会有一个程序,读取这些数据并依照程序解决。

1、队列构造的中间件

2、音讯放入后,不用立刻解决

3、由订阅者 / 消费者按程序解决

也就是说:当遇到一个比拟大或者耗时比拟长的环节的时候,而同时你的业务又不须要立刻晓得这个环节的后果,应用音讯队列是好的抉择。

常识付费的拼团性能应用的就是音讯队列性能;把每个拼团订单都贮存在音讯队列中,拼团实现或拼团完结就能够主动解决这个订单。

application\index\controller\PushJob

/*** 一个应用了队列的 action*/
public static function actionWithDoPinkJob(array $data,string $name=''){
    try{
        // 1. 当前任务将由哪个类来负责解决。$jobHandlerClassName  = 'app\index\job\PullDoPink';
        // 2. 当前任务归属的队列名称,如果为新队列,会主动创立
        $jobQueueName        = Config::get('queue_name', '') ? Config::get('queue_name','') : 'doPinkJobQueue';
        // 3. 当前任务所需的业务数据 . 不能为 resource 类型,其余类型最终将转化为 json 模式的字符串
      if($name){$jobData   = [ 'pinkInfo' => $data, 'time' => date('Y-m-d H:i:s'),'doName'=>$name];
        $isPushed = Queue::push($jobHandlerClassName , $jobData , $jobQueueName);
     } else{$jobData   = [ 'pinkInfo' => $data, 'time' => date('Y-m-d H:i:s')];
       if (!isset($data['pink_time']) || !$data['pink_time']) return true;
       $timewait = $data['pink_time'] + 300;
        // 4. 将该工作推送到音讯队列,期待对应的消费者去执行
      $isPushed = Queue::later($timewait, $jobHandlerClassName , $jobData , $jobQueueName);
    }
        if($isPushed !== false){return 1;}else{return 1;}
    }catch (ErrorException $e){echo $e->getMessage();
    }
}

application\index\job\PullDoPink

/**
 * fire 办法是音讯队列默认调用的办法
 * @param Job            $job      以后的工作对象
 * @param array|mixed    $data     公布工作时自定义的数据
 */
public function fire(Job $job,$data)
{
    // 有些音讯在达到消费者时, 可能曾经不再须要执行了
    $isJobStillNeedToBeDone = $this->checkDatabaseToSeeIfJobNeedToBeDone($data);
    if(!$isJobStillNeedToBeDone){$job->delete();
        return;
    }
    if(isset($data['doName']) && $data['doName']){$doName=$data['doName'];
        $isJobDone = $this->$doName($data);
    }else
        $isJobDone = $this->doPinkJob($data);
    if ($isJobDone) {
        // 如果工作执行胜利,记得删除工作
        $job->delete();}else{if ($job->attempts() > 3) {$job->delete();
        }
    }
}
/**
 * 有些音讯在达到消费者时, 可能曾经不再须要执行了
 * @param array|mixed    $data     公布工作时自定义的数据
 * @return boolean                 工作执行的后果
 */
private function checkDatabaseToSeeIfJobNeedToBeDone($data){return true;}


拼团应用,在订单生成实现后,把参数退出 $do_job_pink 数组中

PushJob::actionWithDoPinkJob($do_job_pink,’doPinkJob’);

在 application\index\job\PullDoPink 下加如上面的办法用来承受解决数据

/**
 * 依据音讯中的数据进行理论的业务解决...
 */
private function doPinkJob($data)
{return true;}

如果须要加新的音讯队列能够设置不同的名称即可

PushJob::actionWithDoPinkJob($do_job_pink,’名称’);

application\index\job\PullDoPink:private function 名称($data)
{return true;}

实现后重新启动音讯队列

最初
如果你感觉这篇文章对你有点用的话,麻烦请给咱们的开源我的项目点点 star:http://github.crmeb.net/u/defu 不胜感激!

收费获取源码地址:http://www.crmeb.com

PHP 学习手册:https://doc.crmeb.com

技术交换论坛:https://q.crmeb.com

退出移动版