laravel队列文档
1.概念理解
连接(connections ):config/queue.php
中有一个connections
配置选项,你可以选择redis、数据库、 Amazon SQS,Beanstalk等作为队列的驱动。
队列(queue):在一个连接中可以存在多个队列,每个队列处理各种的任务,队列名称可以根据需求自己定义。
2.修改配置文件
修改.env文件对应的配置
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
3.job文件
-
首先要生成job文件,命令:
php artisan make:job Logs
这样Logs.php文件就会被默认声称在app/Jobs目录下,你可以吧这个文件移到你的模块下面(记着要改命名空间!)
-
在构造方法中你可以设置连接、队列、尝试次数、超时时间等。
public function __construct(EntityLog $logEntity)
{
$this->connection = 'redis';//使用的连接(该连接的意思是你存入数据时使用的连接,运行队列的时候还需要设置连接,后面会提到)
$this->queue = 'logs'; //使用的队列(该队列的意思是你存入数据时使用的队列,运行队列的时候还需要设置队列,后面会提到)
$this->tries = 3; //任务可以尝试最大次数
$this->timeout = 10; //任务可以执行的最大秒数 (超时时间)。
$this->logEntity = $logEntity;
}
-
在
handel
方法(自动生成的)中,写自己的逻辑,handel方法的参数可以注入,如下:/** * Execute the job. * @param:$logRepository 注入的仓库 * @return void */ public function handle(LogRepositoryInterFace $logRepository) { //调用Repository save方法 $logRepository->save($this->logEntity); }
我这里执行的是把传入的log实体传入log仓库的save方法中,来进行保存日志的操作
-
你可以直接在任务类中定义
failed
方法,允许你在任务失败时执行针对于该任务的清理工作,如发送通知德能/** * 任务失败的处理过程 * * @param Exception $exception * @return void */ public function failed(Exception $exception) { // 给用户发送任务失败的通知,等等…… log::info('日志记录失败'); }
4.使用队列分发任务
一旦你写完了你的任务类你就可以使用它自带的 dispatch
方法分发它。传递给 dispatch
方法的参数将会被传递给任务的构造函数
//存入队列
Logs::dispatch($logEntity);
5.运行队列
-
可以在命令行直接命令:
php artisan queue:work redis --queue=logs
这里的
redis
就是运行时使用的连接,--queue=log
是运行时使用的队列,它会一直运行直到它被手动停止(ctrl+c)或终端被关闭。
-
也可以使用supervisor来运行和管理
Supervisor 是 Linux 操作系统下中的一个进程监控器,它可以在
queue:work
挂掉时自动重启之。-
在 Ubuntu 上安装 Supervisor,你可以使用如下命令:
sudo apt-get install supervisor
-
配置supervisor
[program:logs] process_name=%(program_name)s_%(process_num)02d command=php /home/vagrant/code/plato2/artisan queue:work redis --queue=logs autostart=true autorestart=true user=root numprocs=8 redirect_stderr=true stdout_logfile=/home/vagrant/code/plato2/storage/logs/worker.log
这里
user
填写网站运行进程的用户,如www或者rootnumprocs
表示启动多少个进程来监听Laravel
队列command一行的artisan路径要改成自己的项目路径,
stdout_logfile 也要改成自己的路径
-
启动supervisor
sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start logs:*
这里值得注意的是,如果 Laravel 处理队列的代码更改了,需要重启 Supervisor 的队列管理才能生效
-
其他的supervisor命令
sudo supervisorctl status logs:*(查看进程运行状态) sudo supervisorctl stop log:*(关闭logs开头的进程)
-
网友评论