zoukankan      html  css  js  c++  java
  • 【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输出:

  • 相关阅读:
    codeforces C. No to Palindromes!
    codeforces D. Pashmak and Parmida's problem
    codeforces C. Little Pony and Expected Maximum
    codeforces D. Count Good Substrings
    codeforces C. Jzzhu and Chocolate
    codeforces C. DZY Loves Sequences
    codeforces D. Multiplication Table
    codeforces C. Painting Fence
    hdu 5067 Harry And Dig Machine
    POJ 1159 Palindrome
  • 原文地址:https://www.cnblogs.com/xuzhengzong/p/14703740.html
Copyright © 2011-2022 走看看