laravel中redis队列的使用
一、配置文件
首先我们需要在配置文件中配置默认队列驱动为Redis,:
修改.env
中的QUEUE_CONNECTION=redis
二、编写队列任务
首先我们通过如下Artisan命令创建任务类:
php artisan make:job SendReminderEmail
运行成功后会在app/Jobs
目录下生成一个SendReminderEmail.php
,我们修改其内容如下:
<?php namespace App\Jobs; use App\Jobs\Job; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Bus\SelfHandling; use Illuminate\Contracts\Queue\ShouldQueue; use App\User; use Illuminate\Contracts\Mail\Mailer; class SendReminderEmail extends Job implements SelfHandling, ShouldQueue { use InteractsWithQueue, SerializesModels; protected $user; /** * Create a new job instance. * * @return void */ public function __construct(User $user) { $this->user = $user; } /** * Execute the job. * * @return void */ public function handle(Mailer $mailer) { $user = $this->user; $mailer->send('emails.reminder',['user'=>$user],function($message) use ($user){ $message->to($user->email)->subject('新功能发布'); }); } }
三、推送队列任务
手动分发任务
我们可以使用控制器中的DispatchesJobs
trait(该trait在控制器基类Controller.php
中引入)提供的dispatch
方法手动分发任务:
//在控制其中use use App\Jobs\SendReminderEmail;
接着直接调用就是了
$user = App\User::findOrFail($id); $this->dispatch(new SendReminderEmail($user))->onQueue('sendEmail');//指定队列
四、运行队列监听器
在浏览器中访问http://laravel.app:8000/mail/sendReminderEmail/1
,此时任务被推送到Redis队列中,我们还需要在命令行中运行Artisan命令执行队列中的任务。Laravel为此提供了三种Artisan命令:
queue:work
默认只执行一次队列请求, 当请求执行完成后就终止;queue:listen
监听队列请求,只要运行着,就能一直接受请求,除非手动终止;queue:work --daemon
同listen
一样, 只要运行着,就能一直接受请求,不一样的地方是在这个运行模式下,当新的请求到来的时候,不重新加载整个框架,而是直接fire
动作。能看出来,queue:work --daemon
是最高级的,一般推荐使用这个来处理队列监听。
注:使用
queue:work --daemon
,当更新代码的时候,需要停止,然后重新启动,这样才能把修改的代码应用上。--queue=sendEmail,表示指定消费队列
所以我们接下来在命令行中运行如下命令:
php artisan queue:work --daemon --queue=sendEmail
五、Supervisor 配置
yum安装(推荐)
yum install supervisor #使用yum安装supervisor systemctl enable supervisord.service
这种方式安装好后会生成一个配置文件,路径/etc/supervisord.conf,
可以直接编辑这个文件修改参数啥的,也可以使用刚刚上述的命令再重新生成个配置文件来编辑,
配置 Supervisor#
Supervisor 的配置文件一般是放在 /etc/supervisor/conf.d 目录下。在这个目录中你可以创建任意数量的配置文件来要求 Supervisor 怎样监控你的进程。例如我们创建一个 laravel-worker.conf 来启动与监控一个 queue:work 进程:
[program:hlyun_v3_mms_worker] process_name=%(program_name)s_%(process_num)02d command=php /mnt/hgfs/www/hlyun_v3/hlyun_mms/src/artisan queue:work --queue=logs --sleep=3 --tries=3 --daemon autostart=true autorestart=true user=root numprocs=8 redirect_stderr=true stdout_logfile=/mnt/hgfs/www/hlyun_v3/hlyun_mms/src/storage/logs/worker.log
启动 Supervisor#
当这个配置文件被创建后,你需要更新 Supervisor 的配置,并用以下命令来启动该进程:
supervisor相关操作
sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start laravel-worker:*
默认配置文件启动 supervisord #默认去找/etc/supervisord.conf的配置文件 指定配置文件启动 supervisord -c /etc/supervisor/supervisord.conf 重启supervisor supervisorctl reload 进入supervisor客户端的交互终端 supervisorctl 启动名字为blog的program supervisorctl start blog 停止名字为blog的program supervisorctl stop blog 查看名字为django的program 状态 supervisorctl status blog 查看所有program的状态 supervisorctl status all 启动所有program supervisorctl start all 停止所有program supervisorctl stop all 查看supervisorctl命令 supervisorctl help