【PHP】浅谈php实现订阅发布模式及redis的实现

订阅发布应用场景:

1、广告推送
2、游戏公告
3、广播--短信、邮件
4、跨应用推送--使用同一个redis实例,net发布publish,php常驻内存订阅subscribe处理业务。

1、浅谈下 设计模式中的 订阅发布模式。

A订阅B,B发布消息通过广播介质,A能获取到消息。

2、发布订阅模式和观察者模式区别和联系:https://zhuanlan.zhihu.com/p/51357583

两个模式最大区别就是 耦合度发布订阅是完全解耦的,观察者模式是低耦合的。

1)发布者与订阅者 通过中介进行联系,随时都可以取消订阅实现解耦,并且对应用完全无影响;

2)观察者模式是通过监听方式,实现对象A对 对象B的观察,B发生改变–A同时会做出更新,具有低耦合度。

3、使用php和laravel5实现的几个发布订阅代码案例,仅供参考: (订阅者必须是常驻内存的deamon守护进程)

1)php原生实现发布订阅:

https://blog.csdn.net/weixin_39774219/article/details/110985179

2)laravel5实现发布订阅:

https://blog.csdn.net/qq_24694139/article/details/107539994

https://blog.csdn.net/guoyanga1/article/details/84822200

php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Redis;

class Subscribe extends Command
{
    protected $signature = 'sub:msg';

    protected $description = 'redis测试supervisor配置发布订阅';

    protected $time;

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
//         #订阅消息redis
//         $redis = new \Redis();
//         $redis->pconnect('101.132.147.66', '6379');
//         $redis->auth('oFFsiuT57mFzYWscjX6f');
        //订阅订单id ORDERID
        Redis::subscribe(['channel1'], function($channel, $message) {
            if (!empty($channel)) {
                #这里$message为10002
                if ($message){
                    //存储到自己的redis库 这里配置了多连接
//                     $redis2 = Redis::connection('driver_outset_time');
//                     $redis2->set('ORDERID_'.$message,time());#value为时间time()
//                     $redis2->EXPIRE('ORDERID_'.$message,time(), 24*60*60);#设置key过期时间为24小时
                    $this->xself($channel, $message);#调用其他方法执行其他业务逻辑
                }
            }
        });
    }
    public function xself($channel, $message)
    {
        //TODO
        echo $channel, $message;
    }

}

4、使用supervisor设置守护进程,前端路由或方法 调用示例:

//redis配置的supervisord发布订阅功能
Route::get('redispublish', function () {
    Redis::publish('channel1', json_encode(['foo' => 'bar']));
});

5、cli输出:

【PHP】浅谈php实现订阅发布模式及redis的实现

Original: https://www.cnblogs.com/xuzhengzong/p/14703740.html
Author: PHP急先锋
Title: 【PHP】浅谈php实现订阅发布模式及redis的实现

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/529014/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • NoteOfMySQL-10-触发器与事件

    触发器是由事件来触发某个操作,这些事件包括insert语句、update语句、delete语句,当数据库系统执行这些事件时,就会激活触发器执行相应的操作。事件调度器(event s…

    Linux 2023年6月14日
    0121
  • Redis下载及安装(windows版)

    下载地址1、Github下载地址:https://github.com/MicrosoftArchive/redis/releases2、百度网盘下载地址 https://pan….

    Linux 2023年5月28日
    0113
  • 深入理解java泛型

    什么是Java泛型 泛型的使用 泛型类 泛型接口 泛型方法 泛型的底层实现机制 ArrayList源码解析 什么是泛型擦除 泛型的边界 ?:无界通配符 extends 上边界通配符…

    Linux 2023年6月6日
    0160
  • Postman 正确使用姿势

    前言: 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 简介: Postman是一个接口测试工具,在做接口测试的时候,Postman相当于一个客户端,它可以模拟用户发起的…

    Linux 2023年6月14日
    0100
  • Docker 安装 MySQL、Redis

    1 Docker 中安装 Redis 1.1 创建目录 在硬盘上创建 redis 的数据目录: mkdir -p /Users/yygnb/dockerMe/redis/data …

    Linux 2023年6月7日
    0123
  • OpenSSL测试-SM3

    任务详情 在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务 使用OpenSSL的命令计算你的8位学号的摘要值(SM3),提交截图(5’…

    Linux 2023年6月8日
    0135
  • C++ inline

    inline的坏处:若在一台内存有限的机器上,过度热衷inlining会造成程序体积太大,即使拥有虚拟内存,inline造成的代码膨胀也会导致额外的换页行为,降低指令高速缓存装置的…

    Linux 2023年6月7日
    0136
  • MySQL之外键、表关系及SQL查询关键字

    一、外键 假设现在我们有一张员工信息表,表的字段如下: id # 主键 name # 姓名 age # 年龄 dep_name # 部门名称 dep_desc # 部门描述 单从数…

    Linux 2023年6月14日
    0109
  • Shell文件属性的判断与比较

    Shell支持对文件属性的判断,常用的文件属性操作符很多,如下表所示。更多文件属性操作符可以参考命令帮助手册man test [root@centos7~]#…

    Linux 2023年6月6日
    0111
  • ruoyi接口权限校验

    此文章属于ruoyi项目实战系列 ruoyi系统在前端主要通过权限字符包含与否来动态显示目录和按钮。为了防止通过http请求绕过权限限制,后端接口也需要进行相关权限设计。 @Pre…

    Linux 2023年6月7日
    0196
  • 关于ubuntu执行32位程序报错execvp():No such file or directory的解决方案

    一、前言 在ubuntu 执行一个程序时,居然报错 execvp():No such file or directory ,报错截图如下图所示: ls -al…

    Linux 2023年6月8日
    0146
  • shell handle

    !/bin/bash qinrui set -e commitId =” repoPath =” x1 =” if [-f changes15….

    Linux 2023年5月28日
    0126
  • Linux磁盘管理

    对Linux来说一切皆文件,Linux归根结底只有一个根目录,一个独立且唯一的文件结构,Linux的每个分区都是用来组成整个文件系统的一部分。所以Linux采用了磁盘挂载的方式,将…

    Linux 2023年6月8日
    0130
  • 列表初始化

    C++11将列表初始化(大括号初始化)作为一种通用的初始化方式.可用于所有类型. 数组以前就可以用列表初始化,但 C++11 中的列表初始化新增了一些功能: 初始化数组时,可省略等…

    Linux 2023年6月13日
    0100
  • 自制弹窗拦截器

    一个十分简单的bat脚本 如果需要拦截更多弹窗,只需要将第6~8行复制一下并粘贴到:3后面,将所有的SGtool改成要拦截的进程名即可,每添加一个进程,就要将标号加一,我相信你们能…

    Linux 2023年6月6日
    0121
  • 防止shell script多次运行

    防止shell script多次运行 一个思路是在script初期检测系统中是否存在同名进程。 if [ ps -ef | grep "test.sh" | g…

    Linux 2023年5月28日
    0103
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球