Completed
Branch master (05c729)
by
unknown
20:00
created

maintenance/mcc.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
/**
3
 * memcached diagnostic tool
4
 *
5
 * This program is free software; you can redistribute it and/or modify
6
 * it under the terms of the GNU General Public License as published by
7
 * the Free Software Foundation; either version 2 of the License, or
8
 * (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License along
16
 * with this program; if not, write to the Free Software Foundation, Inc.,
17
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18
 * http://www.gnu.org/copyleft/gpl.html
19
 *
20
 * @file
21
 * @todo document
22
 * @ingroup Maintenance
23
 */
24
25
$optionsWithArgs = [ 'cache' ];
26
$optionsWithoutArgs = [
27
	'debug', 'help'
28
];
29
require_once __DIR__ . '/commandLine.inc';
30
31
$debug = isset( $options['debug'] );
32
$help = isset( $options['help'] );
33
$cache = isset( $options['cache'] ) ? $options['cache'] : null;
34
35
if ( $help ) {
36
	mccShowUsage();
37
	exit( 0 );
38
}
39
$mcc = new MemcachedClient( [
40
	'persistent' => true,
41
	'debug' => $debug,
42
] );
43
44
if ( $cache ) {
45
	if ( !isset( $wgObjectCaches[$cache] ) ) {
46
		print "MediaWiki isn't configured with a cache named '$cache'";
47
		exit( 1 );
48
	}
49
	$servers = $wgObjectCaches[$cache]['servers'];
50
} elseif ( $wgMainCacheType === CACHE_MEMCACHED ) {
51
	$mcc->set_servers( $wgMemCachedServers );
52
} elseif ( isset( $wgObjectCaches[$wgMainCacheType]['servers'] ) ) {
53
	$mcc->set_servers( $wgObjectCaches[$wgMainCacheType]['servers'] );
54
} else {
55
	print "MediaWiki isn't configured for Memcached usage\n";
56
	exit( 1 );
57
}
58
59
/**
60
 * Show this command line tool usage.
61
 */
62
function mccShowUsage() {
63
	echo <<<EOF
64
Usage:
65
	mcc.php [--debug]
66
	mcc.php --help
67
68
MemCached Command (mcc) is an interactive command tool that let you interact
69
with the MediaWiki memcached cache.
70
71
Options:
72
	--debug Set debug mode on the memcached connection.
73
	--help  This help screen.
74
75
Interactive commands:
76
77
EOF;
78
	print "\t";
79
	print str_replace( "\n", "\n\t", mccGetHelp( false ) );
80
	print "\n";
81
}
82
83
function mccGetHelp( $command ) {
84
	$output = '';
85
	$commandList = [
86
		'get' => 'grabs something',
87
		'getsock' => 'lists sockets',
88
		'set' => 'changes something',
89
		'delete' => 'deletes something',
90
		'history' => 'show command line history',
91
		'server' => 'show current memcached server',
92
		'dumpmcc' => 'shows the whole thing',
93
		'exit' => 'exit mcc',
94
		'quit' => 'exit mcc',
95
		'help' => 'help about a command',
96
	];
97
	if ( !$command ) {
98
		$command = 'fullhelp';
99
	}
100
	if ( $command === 'fullhelp' ) {
101
		$max_cmd_len = max( array_map( 'strlen', array_keys( $commandList ) ) );
102
		foreach ( $commandList as $cmd => $desc ) {
103
			$output .= sprintf( "%-{$max_cmd_len}s: %s\n", $cmd, $desc );
104
		}
105
	} elseif ( isset( $commandList[$command] ) ) {
106
		$output .= "$command: $commandList[$command]\n";
107
	} else {
108
		$output .= "$command: command does not exist or no help for it\n";
109
	}
110
111
	return $output;
112
}
113
114
do {
115
	$bad = false;
116
	$showhelp = false;
117
	$quit = false;
118
119
	$line = Maintenance::readconsole();
120
	if ( $line === false ) {
121
		exit;
122
	}
123
124
	$args = explode( ' ', $line );
125
	$command = array_shift( $args );
126
127
	// process command
128
	switch ( $command ) {
129
		case 'help':
130
			// show an help message
131
			print mccGetHelp( array_shift( $args ) );
132
			break;
133
134
		case 'get':
135
			$sub = '';
136
			if ( array_key_exists( 1, $args ) ) {
137
				$sub = $args[1];
138
			}
139
			print "Getting {$args[0]}[$sub]\n";
140
			$res = $mcc->get( $args[0] );
141
			if ( array_key_exists( 1, $args ) ) {
142
				$res = $res[$args[1]];
143
			}
144 View Code Duplication
			if ( $res === false ) {
145
				# print 'Error: ' . $mcc->error_string() . "\n";
146
				print "MemCached error\n";
147
			} elseif ( is_string( $res ) ) {
148
				print "$res\n";
149
			} else {
150
				var_dump( $res );
0 ignored issues
show
Security Debugging Code introduced by
var_dump($res); looks like debug code. Are you sure you do not want to remove it? This might expose sensitive data.
Loading history...
151
			}
152
			break;
153
154
		case 'getsock':
155
			$res = $mcc->get( $args[0] );
156
			$sock = $mcc->get_sock( $args[0] );
157
			var_dump( $sock );
158
			break;
159
160
		case 'server':
161
			if ( $mcc->_single_sock !== null ) {
162
				print $mcc->_single_sock . "\n";
163
				break;
164
			}
165
			$res = $mcc->get( $args[0] );
166
			$hv = $mcc->_hashfunc( $args[0] );
167
			for ( $i = 0; $i < 3; $i++ ) {
168
				print $mcc->_buckets[$hv % $mcc->_bucketcount] . "\n";
169
				$hv += $mcc->_hashfunc( $i . $args[0] );
170
			}
171
			break;
172
173
		case 'set':
174
			$key = array_shift( $args );
175
			if ( $args[0] == "#" && is_numeric( $args[1] ) ) {
176
				$value = str_repeat( '*', $args[1] );
177
			} else {
178
				$value = implode( ' ', $args );
179
			}
180
			if ( !$mcc->set( $key, $value, 0 ) ) {
181
				# print 'Error: ' . $mcc->error_string() . "\n";
182
				print "MemCached error\n";
183
			}
184
			break;
185
186
		case 'delete':
187
			$key = implode( ' ', $args );
188
			if ( !$mcc->delete( $key ) ) {
189
				# print 'Error: ' . $mcc->error_string() . "\n";
190
				print "MemCached error\n";
191
			}
192
			break;
193
194
		case 'history':
195
			if ( function_exists( 'readline_list_history' ) ) {
196
				foreach ( readline_list_history() as $num => $line ) {
197
					print "$num: $line\n";
198
				}
199
			} else {
200
				print "readline_list_history() not available\n";
201
			}
202
			break;
203
204
		case 'dumpmcc':
205
			var_dump( $mcc );
206
			break;
207
208
		case 'quit':
209
		case 'exit':
210
			$quit = true;
211
			break;
212
213
		default:
214
			$bad = true;
215
	} // switch() end
216
217
	if ( $bad ) {
218
		if ( $command ) {
219
			print "Bad command\n";
220
		}
221
	} else {
222
		if ( function_exists( 'readline_add_history' ) ) {
223
			readline_add_history( $line );
224
		}
225
	}
226
} while ( !$quit );
227