think-queues+Redis队列消息
1、安装 thinkphp-queue
composer install topthink/think-queue
2、确保Redis安装好
3、配置消息队列的驱动
return [
'default' => '',
'connector' => 'Redis',
// 服务器地址
'host' => '127.0.0.1',
'password' =>'123456',
'prot' =>'123456',
'timeount'=>0,
'persistent'=>'false',
];
4、消息的创建与推送
我们在业务控制器中创建一个新的消息,并推送到 DemoToQueue队列
新增 \application\index\controller\Queues.php 控制器,在该控制器中添加 index 方法
<?php
namespace app\api\controller;
use think\Controller;
use think\facade\Request;
use think\Queue;
class Queues extends Controller
{
//队列方法测试
public function index(){
$jobhandlerClassName = "app\api\job\Demo";
$jobqueuesName = "DemoToQueue";
$jobData=['ts'=>time()];
$isPushed = Queue::push($jobhandlerClassName,$jobData,$jobqueuesName);
if( $isPushed !== false ){
echo date('Y-m-d H:i:s') . " a new Hello Job is Pushed to the MQ"."<br>";
}else{
echo 'Oops, something went wrong.';
}
}
}
5、消息的消费与删除
编写 Demo消费者类,用于处理 DemoToQueue队列中的任务
新增 \application\index\job\Demo.php 消费者类,并编写其 fire() 方法
<?php
namespace app\api\Job;
use think\Controller;
use think\queue\Job;
class Demo
{
/**
* fire方法是消息队列默认调用的方法
* @param Job $job 当前的任务对象
* @param array|mixed $data 发布任务时自定义的数据
*/
public function fire(Job $job,$data)
{
// 有些消息在到达消费者时,可能已经不再需要执行了
$isDo = $this->checkDatabaseDone($data);
if(!$isDo){
$job->delete();
return;
}
//
$isJob = $this->doJob($data);
if ($isJob) {
// 如果任务执行成功, 记得删除任务
$job->delete();
print("<info>删除成功"."</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 checkDatabaseDone($data){
return true;
}
/**
* 根据消息中的数据进行实际的业务处理...
*/
private function doJob($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>哈哈删掉啦!"."</info> \n");
return true;
}
}
至此,所有的代码都已准备完毕。
6、我们在浏览器种访问Queues/index,可以看到消息推送成功。
http://192.168.1.166:8080/Queues
7、处理任务,切换当前终端窗口的目录到项目根目录下,执行
php think queue:work --queue DemoToQueue
8、可以看到执行的结果类似如下:
<info>Hello Job Started. job Data is: array (
'ts' => 1627266350,
)</info>
<info>Hello Job is Fired at 2021-07-26 10:26:22</info>
<info>哈哈删掉啦!</info>
<info>删除成功</info>
Processed: app\api\job\Demo
至此,我们成功地经历了一个消息的 创建 -> 推送 -> 消费 -> 删除 的基本流程。