• laravel 异步队列的使用


    注:这里以redis队列为例,其他都大同小异

    配置文件

    队列配置文件是config/queue.php:

    return [
     
        'default' => env('QUEUE_DRIVER', 'sync'),
     
        'connections' => [
            'database' => [
                'driver' => 'database',
                'table' => 'jobs',
                'queue' => 'default',
                'expire' => 60,
            ],
            'redis' => [
                'driver' => 'redis',
                'connection' => 'default',
                'queue' => 'default',
                'expire' => 60,
                'retry_after' => 90,
            ],
        ],
     
        'failed' => [
            'database' => 'mysql', 'table' => 'failed_jobs',
        ],
    ];
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    配置文件第一个配置项default用于指定默认的队列驱动,修改.env中的QUEUE_DRIVER即可。
    connection对应config/database.php中redis的default配置;queue为默认队列名称;expire为队列任务过期时间(秒)。这里我们可以保持其默认配置不变。
    配置文件 config/database.php 中配置 Redis 数据库连接

    在这里插入图片描述

    创建任务

    php artisan make:job Test
    
    • 1

    通常,所有的任务类都保存在 app/Jobs 目录

    
    
    namespace App\Jobs;
    
    use App\Extend\Logs;
    use Illuminate\Bus\Queueable;
    use Illuminate\Contracts\Queue\ShouldQueue;
    use Illuminate\Foundation\Bus\Dispatchable;
    use Illuminate\Queue\InteractsWithQueue;
    use Illuminate\Queue\SerializesModels;
    use Illuminate\Support\Facades\DB;
    
    class Test implements ShouldQueue
    {
        use Dispatchable;
        use InteractsWithQueue;
        use Queueable;
        use SerializesModels;
    
        /**
         * 在超时之前任务可以运行的秒数.
         *
         * @var int
         */
        public $timeout = 120;
    
        /**
         * 最大失败次数.
         *
         * @var int
         */
        public $tries = 3;
        private $status;
        private $prize;
    
        /**
         * Create a new job instance.
         *
         * @return void
         */
        public function __construct($status = 0, $prize = [])
        {
            $this->status = $status;
            $this->prize = $prize;
        }
    
        /**
         * Execute the job.
         *
         * @return void
         */
        public function handle()
        {
            sleep(5);
            Db::table('guild_data_log.test')->insert([
                'status' => $this->status,
                'remark' => '队列测试01',
                'created_date' => date('Y-m-d H:i:s'),
                'content' => json_encode($this->prize),
            ]);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    任务调度

    哪里调用,加在哪里

    use App\Jobs\Test;
    
    //可以使用 OnConnection 和 OnQueue 方法。这些方法指定了应该使用的队列连接和队列名称
    dispatch(new Test(1, ['text'=>1111]))->OnConnection('redis')->OnQueue('test');Test::dispatch(99,['111'])->OnConnection('redis')->OnQueue('test');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    执行队列

    php artisan queue:work redis --queue=test --tries=3
    
    • 1

    注: --tries指定任务可尝试的最大次数的

    效果

    在这里插入图片描述
    在这里插入图片描述

    配置 Supervisor

    Supervisor 是 Linux 系统中常用的进程守护程序。如果队列进程 queue:work 意外关闭,它会自动重启启动队列进程。在 Ubuntu 安装Supervisor 非常简单:

    sudo apt-get install supervisor
    
    • 1

    其他的详细情况可以看我另一篇文章:Supervisor的安装配置和使用

    1.创建文件夹和配置文件

    mkdir /etc/supervisor
    echo_supervisord_conf > /etc/supervisor/supervisord.conf
    
    • 1
    • 2

    2.修改/etc/supervisor/supervisord.conf文件内容
    在文件结尾[include]节点处
    把;files = relative/directory/*.ini
    在这里插入图片描述

    改为files = conf.d/*.conf
    在这里插入图片描述
    3.执行supervisorctl reload命令使配置文件生效。

    4.在/etc/supervisor/下创建conf.d文件夹,及test.conf

    [program:laravel-test]
    process_name=%(program_name)s_%(process_num)02d
    command=/usr/bin/php /data/wwwroot/guild/artisan queue:work redis --queue=test --sleep=3 --tries=3
    autostart=true
    autorestart=true
    user=forge
    numprocs=8
    redirect_stderr=true
    stdout_logfile=/home/forge/app.com/worker.log
    stopwaitsecs=3600
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    5.运行supervisord,查看是否生效,执行以下命令:

    supervisord -c /etc/supervisor/supervisord.conf
    
    • 1

    查看任务状态

    supervisorctl status
    
    • 1

    返回对应任务信息,表示运行成功!
    在这里插入图片描述
    6.注意每次修改任务代码都要重启队列才会生效

    //重启命令
    supervisorctl restart laravel-test:laravel-test_00
    //全部重启
    php artisan queue:restart
    或
    supervisorctl reload
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    7.常用命令

     sudo service supervisor stop 停止supervisor服务
     
     sudo service supervisor start 启动supervisor服务
     
     supervisorctl shutdown #关闭所有任务
     
     supervisorctl stop|start program_name #启动或停止服务
     
     supervisorctl status #查看所有任务状态
    
     #查看单个任务状态
     supervisorctl status 服务名
    
     #关闭任务
     supervisorctl stop 服务名|all
    
     #启动任务
     supervisorctl start 服务名|all
    
     #重启任务(不会重新加载有改动的配置)
     supervisorctl restart 服务名|all
    
     #更新新的配置到supervisord
     supervisorctl update
    
     #重新启动配置中的所有程序(会重新加载有改动的配置)
     supervisorctl reload
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
  • 相关阅读:
    C语言暑假学习刷题——Day8
    11.24Spring学习第四天
    如何能保证自动驾驶数据的合规性?
    鱼哥赠书活动第③期:《CTF那些事儿》《构建新型网络形态下的网络空间安全体系》《智能汽车网络安全权威指南》上下册
    ABP - 本地事件总线
    讲点登录业务
    ffmpeg的使用
    多用途折叠式行李拉车设计
    vue3面试题
    计算机网络自学笔记008_Real(应用层)
  • 原文地址:https://blog.csdn.net/qq_36303853/article/details/126254165