1
|
|
|
<?php |
2
|
|
|
/** |
3
|
|
|
* Makes several 'set', 'incr' and 'get' requests on every memcached |
4
|
|
|
* server and shows a report. |
5
|
|
|
* |
6
|
|
|
* This program is free software; you can redistribute it and/or modify |
7
|
|
|
* it under the terms of the GNU General Public License as published by |
8
|
|
|
* the Free Software Foundation; either version 2 of the License, or |
9
|
|
|
* (at your option) any later version. |
10
|
|
|
* |
11
|
|
|
* This program is distributed in the hope that it will be useful, |
12
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
13
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14
|
|
|
* GNU General Public License for more details. |
15
|
|
|
* |
16
|
|
|
* You should have received a copy of the GNU General Public License along |
17
|
|
|
* with this program; if not, write to the Free Software Foundation, Inc., |
18
|
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
19
|
|
|
* http://www.gnu.org/copyleft/gpl.html |
20
|
|
|
* |
21
|
|
|
* @file |
22
|
|
|
* @ingroup Maintenance |
23
|
|
|
*/ |
24
|
|
|
|
25
|
|
|
require_once __DIR__ . '/Maintenance.php'; |
26
|
|
|
|
27
|
|
|
/** |
28
|
|
|
* Maintenance script that makes several 'set', 'incr' and 'get' requests |
29
|
|
|
* on every memcached server and shows a report. |
30
|
|
|
* |
31
|
|
|
* @ingroup Maintenance |
32
|
|
|
*/ |
33
|
|
|
class McTest extends Maintenance { |
34
|
|
|
public function __construct() { |
35
|
|
|
parent::__construct(); |
36
|
|
|
$this->addDescription( "Makes several 'set', 'incr' and 'get' requests on every" |
37
|
|
|
. " memcached server and shows a report" ); |
38
|
|
|
$this->addOption( 'i', 'Number of iterations', false, true ); |
39
|
|
|
$this->addOption( 'cache', 'Use servers from this $wgObjectCaches store', false, true ); |
40
|
|
|
$this->addArg( 'server[:port]', 'Memcached server to test, with optional port', false ); |
41
|
|
|
} |
42
|
|
|
|
43
|
|
|
public function execute() { |
44
|
|
|
global $wgMainCacheType, $wgMemCachedTimeout, $wgObjectCaches; |
45
|
|
|
|
46
|
|
|
$cache = $this->getOption( 'cache' ); |
47
|
|
|
$iterations = $this->getOption( 'i', 100 ); |
48
|
|
|
if ( $cache ) { |
49
|
|
|
if ( !isset( $wgObjectCaches[$cache] ) ) { |
50
|
|
|
$this->error( "MediaWiki isn't configured with a cache named '$cache'", 1 ); |
51
|
|
|
} |
52
|
|
|
$servers = $wgObjectCaches[$cache]['servers']; |
53
|
|
|
} elseif ( $this->hasArg() ) { |
54
|
|
|
$servers = [ $this->getArg() ]; |
55
|
|
|
} elseif ( $wgMainCacheType === CACHE_MEMCACHED ) { |
56
|
|
|
global $wgMemCachedServers; |
57
|
|
|
$servers = $wgMemCachedServers; |
58
|
|
|
} elseif ( isset( $wgObjectCaches[$wgMainCacheType]['servers'] ) ) { |
59
|
|
|
$servers = $wgObjectCaches[$wgMainCacheType]['servers']; |
60
|
|
|
} else { |
61
|
|
|
$this->error( "MediaWiki isn't configured for Memcached usage", 1 ); |
62
|
|
|
} |
63
|
|
|
|
64
|
|
|
# find out the longest server string to nicely align output later on |
65
|
|
|
$maxSrvLen = $servers ? max( array_map( 'strlen', $servers ) ) : 0; |
|
|
|
|
66
|
|
|
|
67
|
|
|
foreach ( $servers as $server ) { |
68
|
|
|
$this->output( |
69
|
|
|
str_pad( $server, $maxSrvLen ), |
70
|
|
|
$server # output channel |
71
|
|
|
); |
72
|
|
|
|
73
|
|
|
$mcc = new MemcachedClient( [ |
74
|
|
|
'persistant' => true, |
75
|
|
|
'timeout' => $wgMemCachedTimeout |
76
|
|
|
] ); |
77
|
|
|
$mcc->set_servers( [ $server ] ); |
78
|
|
|
$set = 0; |
79
|
|
|
$incr = 0; |
80
|
|
|
$get = 0; |
81
|
|
|
$time_start = microtime( true ); |
82
|
|
View Code Duplication |
for ( $i = 1; $i <= $iterations; $i++ ) { |
83
|
|
|
if ( $mcc->set( "test$i", $i ) ) { |
84
|
|
|
$set++; |
85
|
|
|
} |
86
|
|
|
} |
87
|
|
View Code Duplication |
for ( $i = 1; $i <= $iterations; $i++ ) { |
88
|
|
|
if ( !is_null( $mcc->incr( "test$i", $i ) ) ) { |
89
|
|
|
$incr++; |
90
|
|
|
} |
91
|
|
|
} |
92
|
|
View Code Duplication |
for ( $i = 1; $i <= $iterations; $i++ ) { |
93
|
|
|
$value = $mcc->get( "test$i" ); |
94
|
|
|
if ( $value == $i * 2 ) { |
95
|
|
|
$get++; |
96
|
|
|
} |
97
|
|
|
} |
98
|
|
|
$exectime = microtime( true ) - $time_start; |
99
|
|
|
|
100
|
|
|
$this->output( " set: $set incr: $incr get: $get time: $exectime", $server ); |
101
|
|
|
} |
102
|
|
|
} |
103
|
|
|
} |
104
|
|
|
|
105
|
|
|
$maintClass = "McTest"; |
106
|
|
|
require_once RUN_MAINTENANCE_IF_MAIN; |
107
|
|
|
|
If you define a variable conditionally, it can happen that it is not defined for all execution paths.
Let’s take a look at an example:
In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.
Available Fixes
Check for existence of the variable explicitly:
Define a default value for the variable:
Add a value for the missing path: