From 9590795b91988a5901379bb49f4a43eb5eb5db26 Mon Sep 17 00:00:00 2001 From: Ori Livneh Date: Sun, 25 Aug 2013 23:46:21 -0700 Subject: [PATCH] Add 'RedisPubSubFeedEngine' feed engine This patch adds a class which implements the RCFeedEngine interface by publishing recent change notifications to Redis. The class handles the 'redis://' URI scheme. Recent changes are PUBLISHed to the channel 'rc'; a different channel name may be specified as a path component. Change-Id: I846036c091c45059a8947245a1efe92c9800dcf4 --- includes/AutoLoader.php | 1 + includes/DefaultSettings.php | 1 + includes/rcfeed/RedisPubSubFeedEngine.php | 41 +++++++++++++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 includes/rcfeed/RedisPubSubFeedEngine.php diff --git a/includes/AutoLoader.php b/includes/AutoLoader.php index 2e8244158a..0706fe3f5c 100644 --- a/includes/AutoLoader.php +++ b/includes/AutoLoader.php @@ -851,6 +851,7 @@ $wgAutoloadLocalClasses = array( # includes/rcfeed 'RCFeedEngine' => 'includes/rcfeed/RCFeedEngine.php', + 'RedisPubSubFeedEngine' => 'includes/rcfeed/RedisPubSubFeedEngine.php', 'UDPRCFeedEngine' => 'includes/rcfeed/UDPRCFeedEngine.php', 'RCFeedFormatter' => 'includes/rcfeed/RCFeedFormatter.php', 'IRCColourfulRCFeedFormatter' => 'includes/rcfeed/IRCColourfulRCFeedFormatter.php', diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index 880f05a348..cc694a346d 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -5559,6 +5559,7 @@ $wgRCFeeds = array(); * Keys are scheme names, values are names of engine classes. */ $wgRCEngines = array( + 'redis' => 'RedisPubSubFeedEngine', 'udp' => 'UDPRCFeedEngine', ); diff --git a/includes/rcfeed/RedisPubSubFeedEngine.php b/includes/rcfeed/RedisPubSubFeedEngine.php new file mode 100644 index 0000000000..4bcc13375b --- /dev/null +++ b/includes/rcfeed/RedisPubSubFeedEngine.php @@ -0,0 +1,41 @@ + 'JSONRCFeedFormatter', + * 'uri' => "redis://127.0.0.1:6379/rc.$wgDBname", + * ); + * + * @since 1.22 + */ + public function send( array $feed, $line ) { + $parsed = parse_url( $feed['uri'] ); + $server = $parsed['host']; + $options = array( 'serializer' => 'none' ); + $channel = 'rc'; + + if ( isset( $parsed['port'] ) ) { + $server .= ":{$parsed['port']}"; + } + if ( isset( $parsed['query'] ) ) { + parse_str( $parsed['query'], $options ); + } + if ( isset( $parsed['pass'] ) ) { + $options['password'] = $parsed['pass']; + } + if ( isset( $parsed['path'] ) ) { + $channel = str_replace( '/', '.', ltrim( $parsed['path'], '/' ) ); + } + $pool = RedisConnectionPool::singleton( $options ); + $conn = $pool->getConnection( $server ); + $conn->publish( $channel, $line ); + } +} -- 2.20.1