请用thinkphp写一个消息队列的Demo
时间: 2023-09-21 20:06:22 浏览: 181
Thinkphp6 redis队列 消息事件 gatewayworker聊天打通版
好的,下面是一个简单的消息队列Demo:
1. 创建消息队列表
首先需要在数据库中创建一个消息队列表,用来存储待处理的消息,可以使用以下SQL语句进行创建:
```
CREATE TABLE `message_queue` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`content` varchar(255) DEFAULT NULL,
`status` tinyint(1) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```
2. 配置队列
在ThinkPHP中,可以使用Redis或者AMQP作为消息队列的驱动,这里以Redis作为例子,需要在`config.php`文件中添加以下配置信息:
```
// Redis配置
'redis' => [
'type' => 'redis',
'host' => '127.0.0.1',
'port' => 6379,
'password' => '',
'select' => 0,
'timeout' => 0,
],
// 消息队列配置
'queue' => [
'type' => 'redis',
'host' => '127.0.0.1',
'port' => 6379,
'password' => '',
'select' => 0,
'timeout' => 0,
'expire' => 3600,
'prefix' => 'queue_',
],
```
3. 定义消息队列处理器
创建一个名为`Queue`的控制器,在其中定义一个`push`方法,用来将消息插入到消息队列中:
```
class Queue
{
public function push($content)
{
$queue = new \think\queue\Job\Redis([
'redis' => 'redis',
'queue' => 'default',
]);
$queue->push('app\\queue\\Job@handle', [
'content' => $content,
]);
return 'success';
}
}
```
其中,`Job@handle`表示具体处理消息的类和方法,需要在`app/queue`目录下创建一个名为`Job`的类,在其中定义一个`handle`方法,用来处理消息:
```
namespace app\queue;
class Job
{
public function handle($job, $data)
{
// 处理消息
echo $data['content'];
// 标记消息为已处理
$this->updateStatus($job->getId());
}
private function updateStatus($id)
{
db('message_queue')->where('id', $id)->update(['status' => 1]);
}
}
```
4. 插入消息
在需要插入消息的地方调用`Queue`控制器的`push`方法即可将消息插入到消息队列中:
```
public function send()
{
$content = 'hello world';
$result = (new Queue())->push($content);
echo $result;
}
```
5. 处理消息
在后台启动消息队列的监听器,用来处理消息,可以使用以下命令:
```
php think queue:listen --queue default --timeout 1800 --sleep 3
```
其中,`default`表示队列名,`timeout`表示超时时间,`sleep`表示处理完一条消息后等待的时间。
以上就是一个简单的消息队列Demo,可以根据具体需求进行修改和扩展。
阅读全文