侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

hyperf2.1框架使用rabbitmq推送订阅邮件发送功能流程步骤

swoole  /  管理员 发布于 3年前   2186

本篇文章是接上一篇,我的这个2.1版本默认已经安装好了AMQP组件了,直接用rabbitmq就OK了

环境:

centos7

rabbitmq服务器 
https://www.zongscan.com/demo333/89368.html

hyperf2.1

hyperf-ext/mail组件包 
https://www.zongscan.com/demo333/1306.html


进入步骤:


创建生产者

[root@hyperf hyperf-skeleton]# php bin/hyperf.php gen:amqp-producer DemoProducer
[DEBUG] Event Hyperf\Framework\Event\BootApplication handled by Hyperf\Config\Listener\RegisterPropertyHandlerListener listener.
[DEBUG] Event Hyperf\Framework\Event\BootApplication handled by Hyperf\Paginator\Listener\PageResolverListener listener.
[DEBUG] Event Hyperf\Framework\Event\BootApplication handled by Hyperf\ExceptionHandler\Listener\ExceptionHandlerListener listener.
[DEBUG] Event Hyperf\Framework\Event\BootApplication handled by Hyperf\DbConnection\Listener\RegisterConnectionResolverListener listener.
App\Amqp\Producer\DemoProducer created successfully.

代码:直接从官网手册上复制过来

<?php
declare(strict_types=1);
namespace App\Amqp\Producer;

use Hyperf\Amqp\Annotation\Producer;
use Hyperf\Amqp\Message\ProducerMessage;

/**
 * @Producer(exchange="hyperf", routingKey="hyperf")
 */
class DemoProducer extends ProducerMessage
{
    public function __construct($data)
    {
        $this->payload = $data;
    }
}

创建消费者

[root@hyperf hyperf-skeleton]# php bin/hyperf.php gen:amqp-consumer DemoConsumer
[DEBUG] Event Hyperf\Framework\Event\BootApplication handled by Hyperf\Config\Listener\RegisterPropertyHandlerListener listener.
[DEBUG] Event Hyperf\Framework\Event\BootApplication handled by Hyperf\Paginator\Listener\PageResolverListener listener.
[DEBUG] Event Hyperf\Framework\Event\BootApplication handled by Hyperf\ExceptionHandler\Listener\ExceptionHandlerListener listener.
[DEBUG] Event Hyperf\Framework\Event\BootApplication handled by Hyperf\DbConnection\Listener\RegisterConnectionResolverListener listener.
App\Amqp\Consumer\DemoConsumer created successfully.

代码:

<?php
declare(strict_types=1);
namespace App\Amqp\Consumer;

use Hyperf\Amqp\Result;
use Hyperf\Amqp\Annotation\Consumer;
use Hyperf\Amqp\Message\ConsumerMessage;
use PhpAmqpLib\Message\AMQPMessage;

use App\Mail\subs;
use HyperfExt\Mail\Mail;

/**
 * @Consumer(exchange="hyperf", routingKey="hyperf", queue="hyperf", name ="DemoConsumer", nums=1)
 */
class DemoConsumer extends ConsumerMessage
{
    public function consumeMessage($data, AMQPMessage $message): string
    {
        var_dump('消费者正在消费数据:' . $data);
       
        $msg = \GuzzleHttp\json_decode($data,true);
        switch ($msg['type']) {
            case 1 :
                //echo $msg['type'];
                //发邮件
                Mail::to($msg['data']['email'])->send(new subs());
                break;
            case 2 :
                break;
            default:
                echo 666;
        }
        return Result::ACK;
    }
}


配置文件:

hyperf\config\autoload\amqp.php

return [
    'default' => [
        'host' => '192.168.1.98',
        'port' => 5672,
        'user' => 'admin',
        'password' => 'admin',
        'vhost' => '/',

注意:host填写ip地址


新建邮件可邮寄类:

hyperf\app\Mail\subs.php

<?php
declare(strict_types=1);
namespace App\Mail;
use HyperfExt\Contract\ShouldQueue;
use HyperfExt\Mail\Mailable;
use Hyperf\DbConnection\Db;
class subs extends Mailable implements ShouldQueue
{
    /**
     * 创建一个消息实例。
     * @return void
     */
    public function __construct(){}
    /**
     * Build the message.
     */
    public function build()
    {
        $str = '';
        $newart = Db::table('art')->where('is_state',0)->where('is_del',1)->orderBy('pubtime','desc')->take(2)->pluck('title','art_id');
        foreach($newart as $k=>$n) {
            $str .= '<p><a href="https://blog.zongscan.com/art/'.$k.'">'.$n.'</a></p>';
        }
        //邮箱推送文章模板
        $html1 = <<<ht
    <p>Hi,<em style="font-weight: 700;">你好 </em>,本周推送最新两篇文章</p>
    {$str}
ht;
        return $this
            ->subject('ZONGSCAN-本周推送文章')
            ->htmlBody($html1);
    }
}


//订阅功能:(这个功能我之前是有了的,现在改成rabbitmq的方式)

这个就不贴代码了,主要的逻辑是修改用户订阅状态

订阅按钮.png

推送rabbit测试控制器 测试给订阅用户发送邮件

use Hyperf\Amqp\Producer;
use App\Amqp\Producer\DemoProducer;
use Hyperf\Utils\ApplicationContext;

//推送rabbit
public function torabbitmsg()
{
    $user = Db::table('user')->select('user_id','username','email','subscribe')->where('subscribe',1)->get();
    $msg = array('type' => 1, 'rabbit_msg' =>  'rabbit订阅邮件推送', 'rabbit_time' => date("Y-m-d H:i:s", time()));
    foreach($user as $v){
      $msg['data']['user_id'] = $v->user_id;
      $msg['data']['username'] = $v->username;
      $msg['data']['email'] = $v->email;
      //将消息推送给生产者
      $message = new DemoProducer(\GuzzleHttp\json_encode($msg));
      //获取生产者的一个实例
      $producer = ApplicationContext::getContainer()->get(Producer::class);
      //传递消息
      try {
          $producer->produce($message);
      } catch (\Exception $exception) {
          throw new \Swoole\Exception($exception->getMessage());
        }
      }
      return ['msg' => 'rabbit订阅邮件推送', 'time' => date('Y-m-d H:i:s', time()),];
}

到此,流程步骤就撸完了,启动跑一下

测试mq.png

hyperf客户端截图:

string(212) "消费者正在消费数据:{"type":1,"rabbit_msg":"rabbit\u8ba2\u9605\u90ae\u4ef6\u63a8\u9001","rabbit_time":"2021-08-31 13:51:31","data":{"user_id":1,"username":"\u7ba1\u7406\u5458","email":"[email protected]"}}"
Array
(
    [type] => 1
    [rabbit_msg] => rabbit订阅邮件推送
    [rabbit_time] => 2021-08-31 13:51:31
    [data] => Array
        (
            [user_id] => 1
            [username] => 管理员
            [email] => [email protected]
        )
)
1[DEBUG] 1 acked.
string(210) "消费者正在消费数据:{"type":1,"rabbit_msg":"rabbit\u8ba2\u9605\u90ae\u4ef6\u63a8\u9001","rabbit_time":"2021-08-31 13:51:31","data":{"user_id":21,"username":"houtizong","email":"[email protected]"}}"
Array
(
    [type] => 1
    [rabbit_msg] => rabbit订阅邮件推送
    [rabbit_time] => 2021-08-31 13:51:31
    [data] => Array
        (
            [user_id] => 21
            [username] => houtizong
            [email] => [email protected]
        )
)
1[DEBUG] 2 acked.

效果图:

qq邮件.png

钉钉邮件.png


rabbitmq中:

mq.png

mq1.png

注:hyperf中消费者进程会在第一次启动的时候主动去mq消费队列中拉取信息,后面通信就是已建立长连接了,由mq服务端自动推送队列中的数据给消费者去消费



  • 上一条:
    Docker安装RabbitMQ服务环境
    下一条:
    最新访问谷歌的方法,Google镜像了解一下,谷歌镜像列表持续更新中【建议收藏】
  • 昵称:

    邮箱:

    1条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • swoole协程通信之数据处理协程对数据进行读写,保存到协程上下文示例(0个评论)
    • swoole redis连接池应用优化之多协程频繁访问redis(0个评论)
    • php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例(2个评论)
    • php中使用hyperf框架调用文心千帆大模型实现国内版chatgpt功能示例(0个评论)
    • 在hyperf框架中使用基于protobuf的RPC生成器实现rpc服务(1个评论)
    • 近期文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-09
    • 2020-03
    • 2020-06
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-11
    • 2022-03
    • 2022-05
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-07
    • 2023-08
    • 2023-11
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客