Merge "Http::getProxy() method to get proxy configuration"
[lhc/web/wiklou.git] / includes / rcfeed / RedisPubSubFeedEngine.php
1 <?php
2
3 /**
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 * http://www.gnu.org/copyleft/gpl.html
18 *
19 * @file
20 */
21
22 /**
23 * Emit a recent change notification via Redis Pub/Sub
24 *
25 * If the feed URI contains a path component, it will be used to generate a
26 * channel name by stripping the leading slash and replacing any remaining
27 * slashes with '.'. If no path component is present, the channel is set to
28 * 'rc'. If the URI contains a query string, its parameters will be parsed
29 * as RedisConnectionPool options.
30 *
31 * @example
32 * $wgRCFeeds['redis'] = array(
33 * 'formatter' => 'JSONRCFeedFormatter',
34 * 'uri' => "redis://127.0.0.1:6379/rc.$wgDBname",
35 * );
36 *
37 * @since 1.22
38 */
39 class RedisPubSubFeedEngine implements RCFeedEngine {
40
41 /**
42 * @see RCFeedEngine::send
43 */
44 public function send( array $feed, $line ) {
45 $parsed = wfParseUrl( $feed['uri'] );
46 $server = $parsed['host'];
47 $options = [ 'serializer' => 'none' ];
48 $channel = 'rc';
49
50 if ( isset( $parsed['port'] ) ) {
51 $server .= ":{$parsed['port']}";
52 }
53 if ( isset( $parsed['query'] ) ) {
54 parse_str( $parsed['query'], $options );
55 }
56 if ( isset( $parsed['pass'] ) ) {
57 $options['password'] = $parsed['pass'];
58 }
59 if ( isset( $parsed['path'] ) ) {
60 $channel = str_replace( '/', '.', ltrim( $parsed['path'], '/' ) );
61 }
62 $pool = RedisConnectionPool::singleton( $options );
63 $conn = $pool->getConnection( $server );
64 if ( $conn !== false ) {
65 $conn->publish( $channel, $line );
66 return true;
67 } else {
68 return false;
69 }
70 }
71 }