• laravel 定时任务通过队列发送邮件


    关于laravel发送邮件,请先参考我的另一片文章:laravel sendcloud发送邮件,再继续往下看。

    1.用database队列驱动,生成创建这些表的迁移

    php artisan queue:table
    php artisan migrate
    

    用redis 队列驱动需要在配置文件 config/database.php 中配置 Redis 数据库连接

    2.生成任务类

    php artisan make:job SendToStarterMail
    

    生成之后,在handle方法中处理发送邮件

    <?php
    
    namespace App\Jobs;
    
    use Illuminate\Bus\Queueable;
    use Illuminate\Queue\SerializesModels;
    use Illuminate\Queue\InteractsWithQueue;
    use Illuminate\Contracts\Queue\ShouldQueue;
    use Illuminate\Foundation\Bus\Dispatchable;
    use Illuminate\Support\Facades\Log;
    
    class SendToStarterMail implements ShouldQueue
    {
        use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    
        protected $email;
        /**
         * Create a new job instance.
         *
         * @return void
         */
        public function __construct($email)
        {
            $this->email = $email;
        }
    
        /**
         * Execute the job.
         *
         * @return void
         */
        public function handle()
        {
            Mail::to($useremail)->send(new StarterMail($user))//StarterMail为第3步创建的邮件类
            ->cc($moreUsers)
            ->bcc($evenMoreUsers); 
    
        }
    }
    

    3.创定时任务指令

    php artisan make:command SendStarterEmail
    

    就会在app/Console/Commands下生成一个SendStarterEmail.php文件,进入这个文件,自定义指令名:

    protected $signature = 'starter:email';
    

    添加描述

    protected $description = '创业者邀约邮件';
    

    handle方法里写逻辑

     /**
         * Execute the console command.
         *
         * @return mixed
         */
        public function handle()
        {
            //业务逻辑
            $job = (new SendToStarterMail($email))->onConnection('database')->onQueue('emails');//SendToStarterMail为第二步生成的任务类
            dispatch($job);//分发任务到队列
        }
    

    4.设置定时时间

    在app/Console/Kernel.php的schedule方法里添加:

    protected function schedule(Schedule $schedule)
    {
         $schedule->command('starter:email')->dailyAt('12:00');
    }
    

    本地测试时,为方便测试,将执行时间改为everyMinute()运行,正式环境上线时再改回来!

    5.运行队列监听服务

    php artisan queue:work database --queue=emails #database为对接驱动,emails为队列名称,可自定义
    

    正式环境请配置在supervisor里,请参考我的另外一篇文章:supervisor 从安装到使用

    6.正式环境将以下添加如crontab中

    * * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1
    

    测试环境,可运行以下代替:

    php artisan schedule:run
    

    赞赏码

    非学,无以致疑;非问,无以广识

  • 相关阅读:
    sql except 用法,找两个表中非共同拥有的
    ‘堆’出你的洪荒之力
    原来你是个这样的JVM
    变形词
    54题
    最大对称子数组
    java 线程之间通信以及notify与notifyAll区别。
    大型网站架构系列:消息队列
    剑指offer第10题
    & 和 && 区别
  • 原文地址:https://www.cnblogs.com/lxwphp/p/15452764.html
Copyright © 2020-2023  润新知