• 【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 AppConsoleCommands;
    
    use IlluminateConsoleCommand;
    use IlluminateSupportFacadesRedis;
    
    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输出:

  • 相关阅读:
    02类的介绍
    Java图解
    String s=new String("abc")创建了几个对象?
    神经网络(13)--具体实现:random initialization
    神经网络(12)--具体实现:如何对back propagation的正确性进行验证
    神经网络(11)--具体实现:unrolling parameters
    神经网络(10)--有助于对神经网络Backpropagation算法的理解
    神经网络(9)--如何求参数: backpropagation algorithm(反向传播算法)
    神经网络(8)---如何求神经网络的参数:cost function的表达
    神经网络(7)---多分类问题
  • 原文地址:https://www.cnblogs.com/xuzhengzong/p/14703740.html
Copyright © 2020-2023  润新知