thinkphp 实现 redis 队列 和 延迟队列 代码
时间: 2024-10-23 07:01:00 浏览: 36
ThinkPHP框架结合Redis实现队列和延迟队列的步骤通常是这样的:
1. **安装 Redis PHP 扩展**:首先需要确保你的服务器已经安装了Redis,并安装对应的PHP Redis扩展。
2. **配置 Redis 连接**:在 ThinkPHP 的配置文件(如 `config.php` 或者 `.env` 中),添加 Redis 配置项:
```php
'db' => [
//...
'redis' => [
'type' => 'redis', // 使用 Redis 数据库连接
'options' => [
'host' => REDIS_HOST, // Redis 服务器地址
'port' => REDIS_PORT,
'password' => REDIS_PASSWORD, // 如果有密码
'timeout' => 5, // 连接超时时间
'database' => 0, // 连接的数据库索引,默认为 0
],
],
],
```
3. **使用 Redis 库**:ThinkPHP 提供了一个名为 `Redis` 的辅助类,可以方便地操作 Redis。例如创建一个队列:
```php
use think\cache\driver\Redis;
$redis = new Redis();
$redis->connect(); // 初始化连接
// 创建队列
$queue = $redis->get('my_queue');
if (!$queue) {
$queue = new \Redis();
$queue->connect(Redis::REDIS_HOST, Redis::REDIS_PORT);
$queue->set('my_queue', []);
$redis->set('my_queue_key', $queue); // 缓存队列实例
}
```
4. **发送任务到队列**:
```php
$task = ['job_name' => 'do_something', 'params' => ['arg1', 'arg2']];
$queue->lPush('my_queue', json_encode($task)); // 添加任务到队列末尾
```
5. **延迟队列**(如果使用的是第三方服务如 Laravel 的 Horizon,或自建定时任务等):
- 安装第三方延时队列客户端(如 php-rocketeer 或 swoole-queue)
- 设置延迟执行的任务,并在适当的时间间隔后执行:
```php
$delayedTask = ['job_name' => 'do_later', 'params' => ['arg1', 'arg2'], 'delay' => 60]; // 60秒后执行
$queue->rpush('delayed_queue', json_encode($delayedTask));
```
6. **消费队列任务**:
```php
while (true) {
$task = $queue->blPop('my_queue'); // 获取并移除队列首元素
if ($task === false) break; // 如果队列为空则跳出循环
$data = json_decode($task);
call_user_func_array([$data['job_name'], 'execute'], $data['params']);
}
```
阅读全文