做者:不洗碗工做室 - hanxiaophp
版权归做者全部,转载请注明出处mysql
首先,咱们要搞明白几个概念,从小到大依次有:队列任务,队列,链接。 他们属于依次被包含的关系,一个队列里有许多的队列任务,一个链接中能够有许多队列laravel
队列任务: 对每一个用户都会进行的操做,理解为队列任务,比方说用户注册时的,咱们发送验证邮件的操做,每一个用户注册,咱们都会进行,这样的任务咱们能够把它抽象成一个队列任务web
队列: 许多队列挤在一块儿等着被处理,造成了一个队列redis
链接: 队列的储存形式sql
队列处理器 处理队列任务的进程浏览器
举例: 队列任务:某个操做,例如发邮件这个操做,以后咱们会用更简单的操做举例代替框架
队列:队列的存在是为了方便以后的队列处理器处理对应的队列任务,咱们不作讲解工具
链接:database(也就是指mysql),redis等,咱们以database为主post
经过这个命令生成任务类:
php artisan make:job SendEmail
会在这里生成一个Jobs文件夹以及咱们的任务类
顺便创建一个Controller
来负责分发任务
php artisan make:controller QueueTest
具体的代码实现:
如何在控制器里新建一个job,并传递参数呢?请看:
SendEmail.php:
QueueController.php:
路由--web.php:
创建job数据表:
php artisan queue:table
php artisan migrate
一个超简易的添加队列流程就完成了,起服务以后,咱们用postman或者浏览器等工具发送请求
而后你就会发现,即便咱们没有添加任务处理器,咱们的任务仍是嗖的一下被完成了,job表里什么都没有,这是为何呢???
打开.env文件
把它改为database,重复刚才的请求,再查看job表
开启队列任务处理器:
一行命令:php artisan queue:work
这句话能加不少参数,这里不作过多陈述,能够本身查看文档的说明,很容易理解
咱们会发现,任务直接被执行了,这是由于咱们刚刚添加任务的时候,是以当时的时间为准并延迟一分钟执行,当咱们开启处理器的时候早就到时间啦,因此那个队列任务才会一会儿被消费掉
用进程管理器supervisor来让咱们刚刚的任务管理器永久后台运行,不然咱们只能总开着终端窗口才能使任务处理器运行
安装
pip install supervisor
配置
supervisor的启动很是人性化,在命令行输入echo_supervisord_conf
会直接给咱们一份默认的配置文件内容,咱们将其复制下来,在任意一个当前用户有权限的地方新建一个.ini或者.conf后缀结尾的文件(我建立的路径:/usr/local/etc/supervisord.ini
),将内容复制进去,保存便可,但其中有一些内容须要咱们略作修改
为了更直观的查看咱们的进程运行状况,进行以下修改,去除httpserver和port的注释:
这样可让咱们在浏览器里查看进程运行状况
而后最后一行作以下修改:
这里面放咱们的laravel-worker 配置文件,在这里建立并编辑咱们的laravel-worker.ini文件
比较重要的几个参数:
command
: 这里按个人理解是指 supervisor会对这个command命令所产生的进程进行管理,可是因为咱们不在项目文件夹下,不能直接php artisan queue:work
,因此咱们在artisan前面加上咱们的项目路径,被马赛克遮住的部分就是咱们laravel项目的文件目录
user
: 当前的系统用户名称,root等你当前使用的用户名便可
最后一行的logfile
:这里要选择咱们拥有权限的目录才能够,并且文件夹和文件须要咱们手动帮其建立
如此一来,supervisor的配制就大工告成了
而后 surpervisord -c 配置文件目录启动,而个人命令就是:supervisord -c /usr/local/etc/supervisord.ini
在浏览器里输入http://localhost:9001
,就能够看到咱们的任务处理器跑起来啦
咱们的队列任务也顺利执行成功