Thinkphp使用消息队列Queue。我的ThinkPHP版本是5.0
使用composer安装queue包,命令行进入到项目的根目录,输入:
composer require topthink/think-queue
安装完在项目生成了application/extra/queue.php文件,这个是配置消息队列,这里使用redis作为驱动,配置修改为下面内容:
<?php
return [
'connector' => 'Redis',
'expire' => 180, // 任务过期时间,若要禁止则设置为null
'default' => 'default', // 默认队列名称
'host' => '127.0.0.1',
'port' => '6379',
'password' => '',
'select' => 6, // redis db
'timeout' => 0, // redis连接超时时间
'persistent' => false, // 是否是长连接
];
创建任务。
在application/index/controller下,创建MyQueue.php控制器,代码如下:
<?php
namespace app\index\controller;
use think\Queue;
class MyQueue {
public function index() {
// 任务类 - 执行时调用该类的deal方法
$job_class = "app\index\job\Message@deal";
// 队列名称
$job_queue_name = 'Check';
// 数据
$job_data = array('timestamp' => time());
// 把任务加入到消息队列,等待被执行
// 延迟发送任务 5秒
$is_push = Queue::later(5, $job_class, $job_data, $job_queue_name);
// 立即发送任务
// $is_push = Queue::push($job_class, $job_data, $job_queue_name);
if($is_push !== 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.';
}
}
}
实现任务的具体内容,在application/index/job/创建Message.php,代码如下:
<?php
namespace app\index\job;
use think\queue\Job;
class Message {
/* 处理逻辑 */
public function deal(Job $job, $data) {
// 这里实现逻辑
// 任务执行成功 删除任务
$job->delete();
}
}
测试:
浏览器打开http://xxxx/index/MyQueue/index,添加任务完成
命令行进入到项目根目录,输入下面命令执行任务:
php think queue:work --queue Check
监听模式的启动方式可以实现定时器的效果,启动命令:
php think queue:listen --queue Check
listen的方式就是一直在监听,如果有动态加入的任务,会一直执行下去。
listen方式的后台启动命令:
php think queue:listen --queue CheckMessageStatus 1>/dev/null 2>&1 &
参考文档:https://github.com/coolseven/notes/blob/master/thinkphp-queue/README.md