zoukankan      html  css  js  c++  java
  • pubsub模式

    <?php
    
    $pubSuber = new pubSub;
    $token = $pubSuber->subscribe('book', function() {
        var_dump(func_get_args());
        echo "I want to read book!";
    });
    $pubSuber->publish('book', "this is an string.");
    
    $pubSuber->unsubscribe($token);
    
    $pubSuber->publish('book', 'suxiaolin');
    
    /**
     * 实现pubsub模式
     * 来自<<javascript设计模式>>
     * @author 苏小林
     * php>=5.3
     */
    class pubSub {
        private static $topics = array();
        
        /**
         * 发布者
         * @param $topic string 发布的主题
         * @param $args mixed 发布的信息
         * @return object pubsub对象
         */
        public function publish($topic, $args) {
            if (!isset(self::$topics[$topic])) {
                return false;
            }
            
            $subscribes = self::$topics[$topic];
            $len = count($subscribes);
            while($len--) {
                $subscribes[$len]['func']($args);
            }
            
            return $this;
        }
        
        /**
         * 订阅者
         * @param $topic string 订阅的主题
         * @param $fn clouser 接收到发布者发布的信息后执行的动作
         * @return int 动作id
         */
        public function subscribe($topic, $fn) {
            if (!isset(self::$topics[$topic])) {
                self::$topics[$topic] = array();
            }
            
            $token = uniqid();
            $ev = array('func'=>$fn, 'token'=>$token);
            array_push(self::$topics[$topic],$ev);
            
            return $token;
        }
        
        /**
         * 删除指定订阅的指定动作
         * @param $token int 动作id
         * @return mixed 成功返回被删除的动作id,失败返回pubsub对象.
         */
        public function unsubscribe($token) {
            foreach(self::$topics as $k=>$topics) {
                foreach($topics as $key=>$topic) {
                    if ($topic['token'] == $token) {
                        unset(self::$topics[$k][$key]);
                        return $token;
                    }
                }
            }
            return $this;
        }
    }
  • 相关阅读:
    教你作一份高水准的简历
    python并发
    阻塞,非阻塞,同步,异步
    python三层架构
    paramiko与ssh
    python-进程
    生产者消费者模型
    python-线程
    python-socket
    python-mysql
  • 原文地址:https://www.cnblogs.com/mtima/p/3176455.html
Copyright © 2011-2022 走看看