【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)

大家都在看

  • Docker容器镜像打成tar包

    简述需求: 在现在容器上保存镜像进行打包,在另一台服务上使用 首先查看下现有要打tar包的容器 接下来用commit参数进行保存镜像, -a 提交人的姓名 -m “提交…

    Linux 2023年6月8日
    0116
  • 很有创意的AkShell:用JS开发web,轻松发布

    今天看了infoq对作者的采访,感觉很有意思。 我去他们的网站看了下,作者是俄罗斯人,他的目标是最大可能地简化web开发。只需要用浏览器就可以开发 ,点两下鼠标就发布了。 他的哲学…

    Linux 2023年5月28日
    0112
  • Linux系统解压zip包出现中文乱码问题

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    0127
  • jarwarSpringBoot加载包内外资源的方式,告别FileNotFoundException吧

    工作中常常会用到文件加载,然后又经常忘记,印象不深,没有系统性研究过,从最初的war包项目到现在的springboot项目,从加载外部文件到加载自身jar包内文件,也发生了许多变化…

    Linux 2023年6月6日
    0141
  • 冯·诺依曼体系结构

    cpu运算速度>寄存器速度>L1~L3Cache>内存>外设(磁盘)>光盘 外设(输入设备、输出设备)不和cpu直接数据交换 cpu直接和内存数据交换…

    Linux 2023年6月13日
    0132
  • requests模块

    掌握 headers参数的使用 掌握 发送带参数的请求 掌握 headers中携带cookie 掌握 cookies参数的使用 掌握 cookieJar的转换方法 掌握 超时参数t…

    Linux 2023年6月8日
    0139
  • Java并发-建立线程

    一、建立新的线程 方法介绍 1、java.lang.Thread 1.0 Thread(Runnable target) 构造一个新线程,用于调用给定目标的run()方法。 voi…

    Linux 2023年6月7日
    0112
  • 常见开发模型-敏捷开发与瀑布开发模型详解

    引言 在学习软件工程的时候接触过一些软件工程开发模型的相关概念,其中,印象比较深刻的就是瀑布模型和敏捷开发模型。这两种模型在日常的软件开发中都是非常常用的,但是它们也有比较大的区别…

    Linux 2023年6月7日
    0157
  • 添加SSH服务

    1、基于commit命令创建 1.1 启动容器 [root@master ~]# docker run -it ubuntu:18.04 bash #更&am…

    Linux 2023年6月13日
    0137
  • 【已解决】wordpress 修改固定链接 伪静态URL出现nginx 404错误

    一、站点设置 打开站点设置,选择伪静态,选择wordpress 二、wordpress设置 打开wordpress后台,选择 设置 —》固定链接 选择一个你喜欢的格式点…

    Linux 2023年6月14日
    0130
  • Cookie

    题目如下 打开靶机 根据提示,需要admin登录才能得到flag,题目介绍为Cookie欺骗,认证,伪造 打开burpsuite进行抓包,HTTP数据包是可以修改cookie值的 …

    Linux 2023年6月7日
    0110
  • npm常用命令

    npm install npm install=npm i。在git clone项目的时候,项目文件中并没有 node_modules文件夹,项目的依赖文件可能很大。直接执行,np…

    Linux 2023年6月13日
    0127
  • linux 应用程序直接读写寄存器或物理内存

    1.程序说明: 调试驱动程序时,经常遇到候需要查看或设置寄存器的情况,但是直接更改内核代码又不方便。 这里提供一个应用程序源码能在应用层访问底层寄存器。(网上找到的,进行过更改)。…

    Linux 2023年6月6日
    0215
  • 真·Android Zxing 扫码中文乱码解决

    Zxing3.2.1 之前遇到过Android Zxing扫码乱码的问题,网上搜了下解决了下。 今天又遇到了问题。 依然会乱码。 研究总结如下: Zxing 可以在Hints中添加…

    Linux 2023年6月13日
    0103
  • Base-64字符串无效,The input is not a valid Base-64 string as it contains a non-base 64 character

    base64规则: 字符串只可能包含A-Z,a-z,0-9,+,/,=字符 字符串长度是4的倍数 =只会出现在字符串最后,可能没有或者一个等号或者两个等号 首先,C# 做上传文件的…

    Linux 2023年6月7日
    0138
  • C++Lambda表达式

    C++ 11 中的 Lambda 表达式用于定义并创建匿名的函数对象,以简化编程工作。 Lambda 的语法形式如下: [捕获列表] (参数) mutable 或 exceptio…

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