tp6 实现异步消息队列发邮箱+模型监听


任务队列实现


 一、   首先下载任务队列queue类:

composer require topthink/think-queue

然后看自己的配置文件:app->config->queue.php

<?php
return [
    'default'     => 'database', //这里采用的是数据库形式存储
    'connections' => [
        'sync'     => [
            'type' => 'sync',
        ],
        'database' => [
            'type'       => 'database',
            'queue'      => 'default',
            'table'      => 'jobs',  //表名
            'connection' => null,
        ],
        'redis'    => [
            'type'       => 'redis',
            'queue'      => 'default',
            'host'       => '127.0.0.1',
            'port'       => 6379,
            'password'   => '',
            'select'     => 0,
            'timeout'    => 0,
            'persistent' => false,
        ],
    ],
    'failed'      => [
        'type'  => 'none',
        'table' => 'failed_jobs',
    ],
];

 

 

数据表: 

CREATE TABLE `jobs` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `queue` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `payload` longtext COLLATE utf8mb4_unicode_ci,
  `attempts` tinyint(3) unsigned DEFAULT NULL,
  `reserve_time` int(10) unsigned DEFAULT NULL,
  `available_time` int(10) unsigned DEFAULT NULL,
  `create_time` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `zfw_jobs_queue_index` (`queue`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

  

二、建立任务队列:app/job/test.php

//这里执行发送邮件
 public function fire(Job $job, $data)
    {

        if ($job->attempts() > 3) {
            \think\facade\Log::error('Test执行失败了');
            $job->delete();
        } else {
            // 你的数据操作
            // 预约成功 发邮件通知用户
            $toemail='123123123@qq.com'; // 收件人
            $name='xxxxx'; // 名称
            $subject='xxxxxx';  // 类型
            $content='恭喜你';  //内容
//            send_mail();  // 调用common.php中的类
            SendEmail::send_mail($toemail,$name,$subject,$content);
            $job->delete();
        }
    }

 

  使用模型监听事件添加任务到队列中:

public static function onAfterInsert($user)
    {
     //监听调用模型添加的方法执行(用Db的添加方法不会执行监听事件) Queue::later(60, 'app\job\Test', ['name'=>'test'], 'Test'); }

执行任务:

php think queue:listen --queue Test  //执行队列

nohup php think queue:listen --queue Test&   //不以守护进程执行

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM