Laravel队列实现(概念讲解与Supervisor配置)

做者:不洗碗工做室 - hanxiaophp

版权归做者全部,转载请注明出处mysql

为何要使用队列?

  1. 学个框架若是只会写普通业务也太low了,咱们要尝试一些高级的玩法(๑•̀ㅂ•́)و✧!
  2. CSDN上的一篇有关消息队列的文章会给你不少启发

laravel框架里的队列介绍

最好的讲解方法固然是举例子啦

  • 首先,咱们要搞明白几个概念,从小到大依次有:队列任务,队列,链接。 他们属于依次被包含的关系,一个队列里有许多的队列任务,一个链接中能够有许多队列laravel

    1. 队列任务: 对每一个用户都会进行的操做,理解为队列任务,比方说用户注册时的,咱们发送验证邮件的操做,每一个用户注册,咱们都会进行,这样的任务咱们能够把它抽象成一个队列任务web

    2. 队列: 许多队列挤在一块儿等着被处理,造成了一个队列redis

    3. 链接: 队列的储存形式sql

    4. 队列处理器 处理队列任务的进程浏览器

  • 举例: 队列任务:某个操做,例如发邮件这个操做,以后咱们会用更简单的操做举例代替框架

    队列:队列的存在是为了方便以后的队列处理器处理对应的队列任务,咱们不作讲解工具

    链接:database(也就是指mysql),redis等,咱们以database为主post

实战

  1. 经过这个命令生成任务类:

    php artisan make:job SendEmail

    会在这里生成一个Jobs文件夹以及咱们的任务类

    顺便创建一个Controller来负责分发任务

    php artisan make:controller QueueTest

  2. 具体的代码实现:

    如何在控制器里新建一个job,并传递参数呢?请看:

    SendEmail.php:

    QueueController.php:

    路由--web.php:

    创建job数据表:

    php artisan queue:table php artisan migrate

    一个超简易的添加队列流程就完成了,起服务以后,咱们用postman或者浏览器等工具发送请求

    而后你就会发现,即便咱们没有添加任务处理器,咱们的任务仍是嗖的一下被完成了,job表里什么都没有,这是为何呢???

    打开.env文件

    把它改为database,重复刚才的请求,再查看job表

  3. 开启队列任务处理器:

    一行命令:php artisan queue:work

    这句话能加不少参数,这里不作过多陈述,能够本身查看文档的说明,很容易理解

    咱们会发现,任务直接被执行了,这是由于咱们刚刚添加任务的时候,是以当时的时间为准并延迟一分钟执行,当咱们开启处理器的时候早就到时间啦,因此那个队列任务才会一会儿被消费掉

  4. 用进程管理器supervisor来让咱们刚刚的任务管理器永久后台运行,不然咱们只能总开着终端窗口才能使任务处理器运行

    1. 安装

      pip install supervisor

    2. 配置

      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,就能够看到咱们的任务处理器跑起来啦

      咱们的队列任务也顺利执行成功

    参考:laravel社区的一篇关于supervisor运行队列任务处理器的文章

相关文章
相关标签/搜索