/** * Search for item * Return all the items matching parameters if successful, false otherwise * * @param String $server Hostname * @param Integer $port Hostname Port * @param String $key Key to search * @param String $level Level of Detail * @param String $more More action * * @return array */ function search($server, $port, $search, $level = false, $more = false) { $slabs = array(); $items = false; # Executing command : stats if ($level == 'full' && ($result = $this->exec('stats', $server, $port))) { # Parsing result $result = $this->parse($result); $infinite = isset($result['time'], $result['uptime']) ? $result['time'] - $result['uptime'] : 0; } # Executing command : slabs stats if ($result = $this->exec('stats slabs', $server, $port)) { # Parsing result $result = $this->parse($result); unset($result['active_slabs']); unset($result['total_malloced']); # Indexing by slabs foreach ($result as $key => $value) { $key = preg_split('/:/', $key); $slabs[$key[0]] = true; } } # Exploring each slabs foreach ($slabs as $slab => $unused) { # Executing command : stats cachedump if ($result = $this->exec('stats cachedump ' . $slab . ' 0', $server, $port)) { # Parsing result preg_match_all('/^ITEM ((?:.*)' . preg_quote($search, '/') . '(?:.*)) \\[([0-9]*) b; ([0-9]*) s\\]\\r\\n/imU', $result, $matchs, PREG_SET_ORDER); foreach ($matchs as $item) { # Search & Delete if ($more == 'delete') { $items[] = $item[1] . ' : ' . $this->delete($server, $port, $item[1]); # Basic search } else { # Detail level if ($level == 'full') { $items[] = $item[1] . ' : [' . str_pad(Library_Data_Analysis::byteResize($item[2]), 7, ' ', STR_PAD_LEFT) . 'b, Expire : ' . ($item[3] == $infinite ? '∞' : Library_Data_Analysis::uptime($item[3] - time(), true)) . ']'; } else { $items[] = $item[1]; } } } } unset($slabs[$slab]); } if (is_array($items)) { sort($items); } return $items; }
# Calculating query time length $actual[$name]['query_time'] = max((microtime(true) - $time) * 1000, 1); } # Analysing stats foreach ($_ini->cluster($cluster) as $name => $server) { # Making an alias @FIXME Used ? $server = $name; # Diff between old and new dump $stats[$server] = Library_Data_Analysis::diff($previous[$server], $actual[$server]); } # Making stats for each server foreach ($stats as $server => $array) { # Analysing request if (isset($stats[$server]['uptime']) && $stats[$server]['uptime'] > 0) { # Computing stats $stats[$server] = Library_Data_Analysis::stats($stats[$server]); # Because we make a diff on every key, we must reasign some values $stats[$server]['bytes_percent'] = sprintf('%.1f', $actual[$server]['bytes'] / $actual[$server]['limit_maxbytes'] * 100); $stats[$server]['bytes'] = $actual[$server]['bytes']; $stats[$server]['limit_maxbytes'] = $actual[$server]['limit_maxbytes']; $stats[$server]['curr_connections'] = $actual[$server]['curr_connections']; $stats[$server]['query_time'] = $actual[$server]['query_time']; } } # Saving new stats dump file_put_contents($file_path, serialize($actual)); # Showing stats include 'View/LiveStats/Stats.phtml'; break; # Default : No command # Default : No command
$data = array(); $data['stats'] = Library_Command_Factory::instance('stats_api')->stats($server['hostname'], $server['port']); $data['slabs'] = Library_Data_Analysis::slabs(Library_Command_Factory::instance('slabs_api')->slabs($server['hostname'], $server['port'])); $stats = Library_Data_Analysis::merge($stats, $data['stats']); # Computing stats if (isset($data['slabs']['total_malloced'], $data['slabs']['total_wasted'])) { $slabs['total_malloced'] += $data['slabs']['total_malloced']; $slabs['total_wasted'] += $data['slabs']['total_wasted']; } $status[$name] = $data['stats'] != array() ? $data['stats']['version'] : ''; $uptime[$name] = $data['stats'] != array() ? $data['stats']['uptime'] : ''; } } elseif (isset($_GET['server']) && ($server = $_ini->server($_GET['server']))) { # Getting Stats & Slabs stats $stats = Library_Command_Factory::instance('stats_api')->stats($server['hostname'], $server['port']); $slabs = Library_Data_Analysis::slabs(Library_Command_Factory::instance('slabs_api')->slabs($server['hostname'], $server['port'])); $settings = Library_Command_Factory::instance('stats_api')->settings($server['hostname'], $server['port']); } # Stats are well formed if ($stats !== false && $stats != array()) { # Analysis $stats = Library_Data_Analysis::stats($stats); include 'View/Stats/Stats.tpl'; } else { include 'View/Stats/Error.tpl'; } unset($stats); break; } # Showing footer include 'View/Footer.tpl';