• Laravel 队列发送邮件


    批量处理任务的场景在我们开发中是经常使用的,比如邮件群发,消息通知,短信,秒杀等等,我们需要将这个耗时的操作放在队列中来处理,从而大幅度缩短Web请求和相应的时间。下面讲解下Laravel中队列的使用

    • 配置文件 config/queue.php

    <?php
    
    return [
    
    
        'default' => env('QUEUE_DRIVER', 'sync'),
    
        'connections' => [
    
            'sync' => [
                'driver' => 'sync',
            ],
    
            'database' => [
                'driver' => 'database',
                'table' => 'jobs',
                'queue' => 'default',
                'retry_after' => 90,
            ],
    
            'beanstalkd' => [
                'driver' => 'beanstalkd',
                'host' => 'localhost',
                'queue' => 'default',
                'retry_after' => 90,
            ],
    
            'sqs' => [
                'driver' => 'sqs',
                'key' => 'your-public-key',
                'secret' => 'your-secret-key',
                'prefix' => 'https://sqs.us-east-1.amazonaws.com/your-account-id',
                'queue' => 'your-queue-name',
                'region' => 'us-east-1',
            ],
    
            'redis' => [
                'driver' => 'redis',
                'connection' => 'default',
                'queue' => 'default',
                'retry_after' => 90,
            ],
    
        ],
    
    
    
        'failed' => [
            'database' => env('DB_CONNECTION', 'mysql'),
            'table' => 'failed_jobs',
        ],
    
    ];
    

    配置文件默认使用的是同步驱动sync,每一种队列驱动的配置都可以在该文件中找到, 包括数据库, Beanstalkd, Amazon SQS, Redis。 其中还包含了一个null队列驱动用于那些放弃队列的任务。failed配置项用于配置失败队列任务存放的数据库及数据表。 接下来我们需要创建一个队列任务类。具体配置可以参考文档 队列驱动配置

    • 创建队列任务类,之后会在app/Jobs目录下生成一个SendEmail.php的文件

    php artisan make:job SendEmail
    
     
    <?php
    
    namespace AppJobs;
    
    use AppUser;
    use IlluminateBusQueueable;
    use IlluminateQueueSerializesModels;
    use IlluminateQueueInteractsWithQueue;
    use IlluminateContractsQueueShouldQueue;
    use IlluminateFoundationBusDispatchable;
    use IlluminateSupportFacadesMail;
    
    class SendEmail implements ShouldQueue
    {
        use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
        protected $user;
        /**
         * Create a new job instance.
         *
         * @return void
         */
        public function __construct(User $user)
        {
            $this->user = $user;
        }
    
        /**
         * 执行队列的方法 比如发送邮件
         *
         * @return void
         */
        public function handle()
        {
          $user = $this->user;
          
          Mail::raw('这里填写邮件的内容',function ($message){
                 // 发件人(你自己的邮箱和名称)
                $message->from('your_email@163.com', 'yourname');
                // 收件人的邮箱地址
                $message->to($this->user);
                // 邮件主题
                $message->subject('队列发送邮件');
            });
        }
    }
    

    任务类创建完之后到控制器 把数据加入到队列

    • 创建发送消息的控制器 使用dispatch方法手动分发任务,方法里传一个任务类的实例

    <?php
    
    namespace AppHttpControllers;
    use AppJobsSendEmail;
    use AppUser;
    
    class MessageController extends Controller
    {
        public function index()
        {
            $user = User::find(1);
    
            $this->dispatch(new SendEmail($user));
        }
    }
    
    • 然后访问浏览器,运行项目把任务推送到队列中。然后使用Artisan命令,执行队列里的任务

    php artisan queue:

    queue:work 默认只执行一次队列请求, 当请求执行完成后就终止;
    queue:listen 监听队列请求,只要运行着,就能一直接受请求,除非手动终止;
    queue:work --daemon同listen一样,不同的是work不需要再次加载框架,直接运行任务,一般推荐使用这个来处理队列监听。
    
    注:使用 queue:work --daemon ,当更新代码的时候,需要停止,然后重新启动,这样才能把修改的代码应用上
    注意事项 : 如果队列在运行时,改变了任务类 处理操作 必须要重启 队列任务 这个坑死我了
    害的我一直测试
    队列处理器 & 部署
    因为队列处理器都是 long-lived 进程,如果代码改变而队列处理器没有重启,他们是不能应用新代码的。
    所以最简单的方式就是重新部署过程中要重启队列处理器。你可以很优雅地只输入 queue:restart 来重启所有队列处理器。

    https://segmentfault.com/a/1190000010755314
  • 相关阅读:
    PyQt作品 – PingTester – 多点Ping测试工具
    关于和技术人员交流的一二三
    Pyjamas Python Javascript Compiler, Desktop Widget Set and RIA Web Framework
    Hybrid Qt applications with PySide and Django
    pyjamas build AJAX apps in Python (like Google did for Java)
    PyQt 维基百科,自由的百科全书
    InfoQ:请问为什么仍要选择Java来处理后端的工作?
    Eric+PyQt打造完美的Python集成开发环境
    python select module select method introduce
    GUI Programming with Python: QT Edition
  • 原文地址:https://www.cnblogs.com/lxwphp/p/9366072.html
Copyright © 2020-2023  润新知