一 、使用composer下载queue
thinkphp5.0的话使用这个
composer require topthink/think-queue=1.1.6
更高版本使用这个
composer require topthink/think-queue
二、创建者控制器
1、创建一个Job控制器,引入queue类
2、1 * 10 是等待时长,单位是秒
3、@前面是取消订单控制器的地址,要带着controller,后面是控制器里面的方法,默认为fire
<?php
namespace app\admin\controller;
use app\common\controller\Backend;
use think\Queue;
/**
* 后台首页
* @internal
*/
class Job extends Backend
{
protected $noNeedLogin = ['login'];
protected $noNeedRight = ['index', 'logout'];
protected $layout = '';
public function _initialize()
{
parent::_initialize();
//移除HTML标签
$this->request->filter('trim,strip_tags,htmlspecialchars');
}
public function createOrder()
{
// 创建订单业务代码
Queue::later(1 * 10, 'app\admin\controller\Hello@closeOrder', 3); //加入队列,并延迟关闭时间执行
}
}
三、消费者控制器
1、引入job类
2、写自己逻辑的方法就行,注释都有
<?php
/**
* 文件路径: \application\index\job\Hello.php
* 这是一个消费者类,用于处理 helloJobQueue 队列中的任务
*/
namespace app\admin\controller;
use think\queue\Job;
class Hello {
protected $noNeedLogin = ['*'];
protected $noNeedRight = ['index', 'logout'];
protected $layout = '';
/**
* fire方法是消息队列默认调用的方法
* @param Job $job 当前的任务对象
* @param array|mixed $data 发布任务时自定义的数据
*/
public function fire(Job $job,$data){
// 如有必要,可以根据业务需求和数据库中的最新数据,判断该任务是否仍有必要执行.
$isJobStillNeedToBeDone = $this->checkDatabaseToSeeIfJobNeedToBeDone($data);
if(!$isJobStillNeedToBeDone){
$job->delete();
return;
}
$isJobDone = $this->doHelloJob($data);
if ($isJobDone) {
//如果任务执行成功, 记得删除任务
$job->delete();
print("<info>22222222"."</info>\n");
}else{
if ($job->attempts() > 3) {
//通过这个方法可以检查这个任务已经重试了几次了
print("<warn>Hello Job has been retried more than 3 times!"."</warn>\n");
$job->delete();
// 也可以重新发布这个任务
//print("<info>Hello Job will be availabe again after 2s."."</info>\n");
//$job->release(2); //$delay为延迟时间,表示该任务延迟2秒后再执行
}
}
}
/**
* 有些消息在到达消费者时,可能已经不再需要执行了
* @param array|mixed $data 发布任务时自定义的数据
* @return boolean 任务执行的结果
*/
private function checkDatabaseToSeeIfJobNeedToBeDone($data){
return true;
}
public function closeOrder(Job $job, $data)
{
print("<info>11111111111".$data."</info>\n");
$job->delete();
}
/**
* 根据消息中的数据进行实际的业务处理
* @param array|mixed $data 发布任务时自定义的数据
* @return boolean 任务执行的结果
*/
private function doHelloJob($data) {
// 根据消息中的数据进行实际的业务处理...
print("<info>Hello Job Started. job Data is: ".var_export($data,true)."</info> \n");
print("<info>Hello Job is Fired at " . date('Y-m-d H:i:s') ."</info> \n");
print("<info>Hello Job is Done!"."</info> \n");
return true;
}
}
四、监听&进程守护
php think queue:listen
进程守护的话宝塔搜索就行