• laravel使用消息队列


    队列

    队列用于异步执行消耗时间多的工作,比如发送邮件等操作,好处是可以快速为客户响应结果,具体处理异步后台的操作。

    下面的操作使用高效的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自动维护吧。

  • 相关阅读:
    【JMeter】if语句中不能Failure=false解决办法
    【java】method.invoke(方法底层所属对象/null,new Object[]{实际参数})
    【java设计模式】【行为模式Behavioral Pattern】模板方法模式Template Method Pattern
    【java设计模式】代理模式
    33-算法训练 安慰奶牛
    32-java 里面list的问题
    31-java中知识总结:list, set, map, stack, queue
    30-算法训练 最短路 spfa
    29-算法训练 结点选择-超时了!!!
    28-算法训练 最大最小公倍数 -贪心
  • 原文地址:https://www.cnblogs.com/wxvirus/p/12896778.html
Copyright © 2020-2023  润新知