要在 Laravel 中使用 Redis 作为队列驱动,你需要进行一些配置。
1. 配置 Redis
首先,你需要确保安装了 predis/predis
或 phpredis
PHP 扩展,以便 Laravel 可以与 Redis 交互。
安装 Predis
你可以通过 Composer 安装 predis/predis
:
composer require predis/predis
2. 配置 .env 文件
在你的 .env
文件中,配置 Redis 的连接信息:
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
QUEUE_CONNECTION=redis
3. 配置 queue.php 文件
在 config/queue.php
配置文件中,确保 Redis 队列连接已经配置好。默认情况下,Laravel 已经为你生成了这些配置:
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => env('REDIS_QUEUE', 'default'),
'retry_after' => 90,
'block_for' => null,
],
4. 配置 database.php 文件
同样地,在 config/database.php
文件中,确保 Redis 配置正确:
'redis' => [
'client' => env('REDIS_CLIENT', 'predis'),
'options' => [
'cluster' => env('REDIS_CLUSTER', 'redis'),
'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
],
'default' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_DB', '0'),
],
'cache' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_CACHE_DB', '1'),
],
],
5. 确保队列监听器运行
为了处理队列中的任务,你需要运行队列工作进程。你可以使用以下命令启动队列工作进程:
php artisan queue:work
你也可以使用 queue:listen
命令启动队列监听器:
php artisan queue:listen
6. 创建队列任务
最后,你需要创建一个队列任务(Job)。你可以使用 Artisan 命令生成一个新的 Job 类:
php artisan make:job SendOrderConfirmation
这将在 app/Jobs
目录下创建一个新的 Job 类。在这个类中,你可以定义任务执行的逻辑。例如:
namespace App\Jobs;
use App\Order;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class SendOrderConfirmation implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $order;
public function __construct(Order $order)
{
$this->order = $order;
}
public function handle()
{
// 发送订单确认邮件的逻辑
}
}
7. 调度任务
你可以在事件监听器或控制器中将任务调度到队列中。例如,在 OrderCreated
事件监听器中:
namespace App\Listeners;
use App\Events\OrderCreated;
use App\Jobs\SendOrderConfirmation;
class SendOrderConfirmationListener
{
public function handle(OrderCreated $event)
{
// 将任务推送到队列中
SendOrderConfirmation::dispatch($event->order);
}
}