队列
队列用于异步执行消耗时间多的工作,比如发送邮件等操作,好处是可以快速为客户响应结果,具体处理异步后台的操作。
下面的操作使用高效的redis完成处理,所以需要安装相应的扩展包
composer require "predis/predis:~1.0"
处理失败任务
有时你的队列任务会失败。Laravel包含了一个便捷的方式指定任务会被最大尝试的次数。在一个任务到达了它最大尝试次数之后,它会被放入failed_jobs
表。要创建failed_jobs
表你可以使用queue:failed-table
命令:
php artisan queue:failed-table
php artisan migrate
创建任务
php artisan make:job TestJob
在生成的类中的handle
方法设置任务具体的动作,下面是一个简单的示例。
protected $user;
public function __construction(User $user)
{
$this->user = $user;
}
public function handle()
{
sleep(6);
file_put_contents('a.php', var_export($this->user->toArray(), true));
}
分发任务
TestJob::dispatch(User::find(1));
队列处理器
队列处理器用于执行推送到队列中的任务
php artisan queue:work
要使
queue:work
在后台运行需要使用下面的Supervisor
(生产环境必用)
Laravel队列监控面板
Horizon提供了一个漂亮的仪表盘,并且可以通过代码配置你的Laravel Redis队列,同时能够让你轻松地监控你的队列系统中诸任务吞吐量,运行时间和失败任务等关键指标
安装
composer require laravel/horizon
php artisan vendor:publish --provider="LaravelHorizonHorizonServiceProvider"
启动执行任务监听
只需要一条命令语句即可启动队列执行进程。如果修改了任何代码需要重启horizon
监听(需要在Homestead系统中执行)
php artisan horizon
可以通过路由/horizon
以图形界面查看任何状态
Supervisor
Supervisor是一个进程控制系统,用于让我们的队列在后台运行,并自动维护进行,如果挂了就自动重启。
修改配置文件
sudo vi /etc/supervisor/conf.d/laravel-worker.conf
内容如下
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/vagrant/Code/laravel-cms/artisan queue:work --sleep=3 --tries=3
autostart=true
autorestart=true
user=vagrant
numprocs=8
redirect_stderr=true
stdout_logfile=/home/vagrant/Code/laravel-cms/worker.log
注意command与stdout_logfile配置根据环境自行更改
运行
一次执行下面命令加载配置并运行Supervisor
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*
这样我们就不需要执行
php artisan queue:work
命令了,交给Supervisor
自动维护吧。