laravels安装horizon和Supervisor
队列
队列用于异步执行消耗时间多的工作,比如发送邮件等操作,好处是可以快速为客户响应结果,具体处理异步后台的操作。
下面的操作使用高效的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));
$this->onQueue('smsJob');//如果这里添加了队列名称,开启队列的时候需要指定,否则队列无法运行 php artisan queue:work --queue='smsJob'
}
分发任务
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="Laravel\Horizon\HorizonServiceProvider"
启动执行任务监听
只需要一条命令语句即可启动队列执行进程。如果修改了任何代码需要重启horizon
监听(需要在Homestead系统中执行)
php artisan horizon
可以通过路由/horizon
以图形界面查看任何状态
Supervisor
一、安装:
依次执行 yum install python-setuptools、yum install easy_install supervisor 进行安装
Supervisor是一个进程控制系统,用于让我们的队列在后台运行,并自动维护进行,如果挂了就自动重启。
二、创建 /etc/supervisor/ 目录,并生成默认配置文件
mkdir /etc/supervisor
cd supervisor
echo_supervisord_conf > supervisor.conf
vim /etc/supervisord.conf 如果没有,才执行上面红色的代码
修改配置文件
创建 /etc/supervisor/conf.d 目录,添加配置文件 laravel-worker.conf 文件如下
sudo vi /etc/supervisor/conf.d/laravel-worker.conf
# 使用program 后的参数区分不同的应用 #[program: larave-worker-queue] # 队列应用 # 运行的命令 #command=php /www/project/artisan queue:work --queue='orderDone' # 脚本运行的用户身份 #user=root #process_name=%(program_name)s_%(process_num)d # 应用目录 #directory=/www/project # 日志目录 #stdout_logfile=/var/log/supervisor/laravel-worker.log #redirect_stderr=true #numprocs=1 [program: larave-worker-horizon] # horizon 应用 command=php /www/project/artisan horizon user=root autostart=true autorestart=true process_name=%(program_name)s_%(process_num)d #directory=/www/project stdout_logfile=/var/log/supervisor/laravel-worker.log redirect_stderr=true numprocs=1
注意command与stdout_logfile配置根据环境自行更改
在supervisor.conf最后一行修改成
files = /etc/supervisor/conf.d/*.conf 【有的时候不行,可以直接把laravel-worker.conf内容复制到supervisor.conf里面
supervisord -c /etc/supervisord.conf 就是-c后面配置文件的最下面,这样就可以识别了】
查看 /var/log/supervisor/laravel-worker.log日志文件是否正确生成
运行
一次执行下面命令加载配置并运行Supervisor
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*
如果报错,查看如下
# supervisorctl status unix:///var/tmp/supervisor.sock refused connection # supervisord -c /etc/supervisord.conf Error: could not find config file /etc/supervisor/supervisord.conf For help, use /usr/bin/supervisord -h # whereis supervisord.conf supervisord: /usr/bin/supervisord /etc/supervisord.conf /etc/supervisord # supervisord -c /etc/supervisord.conf Unlinking stale socket /var/tmp/supervisor.sock # unlink /tmp/supervisor.sock unlink: cannot unlink `/tmp/supervisor.sock’: No such file or directory # unlink /var/tmp/supervisor.sock # supervisorctl status unix:///var/tmp/supervisor.sock no such file # supervisord -c /etc/supervisord.conf
//启动
sudo supervisord -c /etc/supervisor/supervisord.conf
// 查看运行状态
sudo supervisorctl status
sudo supervisorctl restart all
这样我们就不需要执行
php artisan queue:work
命令了,交给Supervisor
自动维护吧。