1.composer命令安装依赖
composer require topthink/think-queue 2.0.4
2.查看依赖是否安装成功
php think queue:work -h
3.依赖文件存在位置
4.此消息队列基于Redis,所以php的redis扩展必须+Redis也必须安装
5.消息队列和Redis配置文件
TP5.1直接放在根目录的Config目录下
<?php
return [
'connector' => 'Redis',
'expire' => null, // 任务过期时间,默认为60秒,若要禁用,则设置为 null
'default' => 'default', // 默认的队列名
'host' => '127.0.0.1', // redis 主机ip
'port' => 6379, // redis 端口
'password' => '', // redis 密码
'select' => 0, // 使用哪里一个 db,默认为 db0
'timeout' => 0, // redis 连接的超时时间
'persistent' => false, // 是否是长连接
];
6.生产者,将数据添加到redis消息队列中
<?php
namespace app\index\controller;
use think\Controller;
use think\Queue;
use think\cache\driver\Redis;
class Test extends Controller
{
// 生产者,添加消息队列
public function addQueue()
{
// 消息队列名
$queueName = 'testQueue';
//执行数据是数组
//每次20个
$dataold = range(6241,30000);
$data=array_chunk($dataold,1);
// 推入消息队列,注意这里的 ::class 是PHP5.5才有的写法
foreach($data as $key=>$val){
$isPushed = Queue::push(Testqueue::class, $val, $queueName);
}
// PHP5.5以下的可以直接写命名空间
// $isPushed = Queue::push('app\common\queue\TestQueue', $data, $queueName);
//$redis=new redis();
if ($isPushed !== false) {
// 成功之后的业务
echo '队列加入成功';
} else {
// 失败之后的业务
echo '队列加入失败';
}
}
}
7.消费者,调用方法做具体处理
<?php
namespace app\index\controller;
use think\Controller;
use think\Log;
use think\queue\Job;
use app\index\controller\Admin;
class Testqueue extends Controller
{
// 消费者执行入口
public function fire(Job $job, $data)
{
// 具体执行业务
$isJobDone = $this->doJob($data);
if ($isJobDone) {
// 消息队列执行成功,删除队列,否则会一直执行
$job->delete();
} else {
// 消息队列执行失败
// 获取消息队列已经重试了几遍
$attempts = $job->attempts();
if ($attempts == 0 || $attempts == 1) {
// 重新发布,参数 delay 是延时发布的时间
$job->release(2);
}
}
}
// 消息队列执行失败后会自动执行该方法
public function failed($data)
{
Log::error('max_false:' . json_encode($data));
}
// 消息队列执行方法
public function doJob($data)
{
// 具体执行业务
//调用接口
$Admin = new admin();
$return = $Admin->composeInput($data);
$returnpd=json_encode($return);
$data = json_encode($data);
echo '+++dataArray2+++:' . $data;
// 这里的判断条件以具体业务是否执行成功进行判断
if ($returnpd) {
echo "+++success+++";
return true;
} else {
echo "+++false+++";
return false;
}
}
}
8.开启队列监听
php think queue:work --daemon --queue testQueue
其中testQueue为消息队列名称,在生产者代码中指定
拓展:如果你想关闭终端还能继续消费,如下
nohup php think queue:listen --queue 队列名 &