| +----------------------------------------------------------------------+ */ $VERSION='$Id: memcache.php,v 1.1.2.3 2008/08/28 18:07:54 mikl Exp $'; define('DATE_FORMAT', 'Y/m/d H:i:s'); define('GRAPH_SIZE', 200); define('MAX_ITEM_DUMP', 50); // Allow local configuration: change local values in (this file).local.php $file = $_SERVER['SCRIPT_FILENAME']; $local = preg_replace('/(.*)(\.php)$/', '$1.local$2', $file); if (is_readable($local)) { // echo "

Loading local config from $local

"; require $local; } if (!defined('ADMIN_USERNAME')) { define('ADMIN_USERNAME', 'apc'); } if (!defined('ADMIN_PASSWORD')) { define('ADMIN_PASSWORD', 'apc'); } if (empty($MEMCACHE_SERVERS)) { $MEMCACHE_SERVERS[] = 'localhost:11211'; // add more as an array $MEMCACHE_SERVERS[] = '127.0.0.1:11211'; // add more as an array //$MEMCACHE_SERVERS[] = 'mymemcache-server1:11211'; // add more as an array //$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array } ////////// END OF DEFAULT CONFIG AREA ///////////////////////////////////////////////////////////// ///////////////// Password protect //////////////////////////////////////////////////////////////// if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) || $_SERVER['PHP_AUTH_USER'] != ADMIN_USERNAME ||$_SERVER['PHP_AUTH_PW'] != ADMIN_PASSWORD) { Header("WWW-Authenticate: Basic realm=\"Memcache Login\""); Header("HTTP/1.0 401 Unauthorized"); echo <<

Rejected!

Wrong Username or Password! EOB; exit; } ///////////MEMCACHE FUNCTIONS ///////////////////////////////////////////////////////////////////// function sendMemcacheCommands($command) { global $MEMCACHE_SERVERS; $result = array(); foreach ($MEMCACHE_SERVERS as $server) { $strs = explode(':', $server); $host = $strs[0]; $port = $strs[1]; $result[$server] = sendMemcacheCommand($host, $port, $command); } return $result; } function sendMemcacheCommand($server, $port, $command) { $s = @fsockopen($server,$port); if (!$s){ die("Can't connect to:". $server .':'. $port); } fwrite($s, $command."\r\n"); $buf = ''; while ((!feof($s))) { $buf .= fgets($s, 256); if (strpos($buf, "END\r\n") !== false){ // stat says end break; } if (strpos($buf, "DELETED\r\n") !== false || strpos($buf, "NOT_FOUND\r\n") !== false) { // delete says these break; } if (strpos($buf, "OK\r\n") !== false){ // flush_all says ok break; } } fclose($s); return parseMemcacheResults($buf); } function parseMemcacheResults($str){ $res = array(); $lines = explode("\r\n", $str); $cnt = count($lines); for($i=0 ; $i< $cnt ; $i++) { $line = $lines[$i]; $l = explode(' ', $line, 3); if (count($l) == 3) { $res[$l[0]][$l[1]] = $l[2]; if ($l[0] == 'VALUE') { // next line is the value $res[$l[0]][$l[1]] = array(); list ($flag, $size) = explode(' ', $l[2]); $res[$l[0]][$l[1]]['stat'] = array( 'flag' => $flag, 'size' => $size, ); $res[$l[0]][$l[1]]['value'] = $lines[++$i]; } } elseif ($line == 'DELETED' || $line == 'NOT_FOUND' || $line == 'OK') { return $line; } } return $res; } function dumpCacheSlab($server, $slabId, $limit) { list($host, $port) = explode(':',$server); $resp = sendMemcacheCommand($host, $port, 'stats cachedump '. $slabId .' '. $limit); return $resp; } function flushServer($server) { list($host, $port) = explode(':', $server); $resp = sendMemcacheCommand($host, $port, 'flush_all'); return $resp; } function getCacheItems() { $items = sendMemcacheCommands('stats items'); $serverItems = array(); $totalItems = array(); foreach ($items as $server => $itemlist) { $serverItems[$server] = array(); $totalItems[$server] = 0; if (!isset($itemlist['STAT'])) { continue; } $iteminfo = $itemlist['STAT']; foreach($iteminfo as $keyinfo => $value) { if (preg_match('/items\:(\d+?)\:(.+?)$/', $keyinfo, $matches)) { $serverItems[$server][$matches[1]][$matches[2]] = $value; if ($matches[2] == 'number') { $totalItems[$server] +=$value; } } } } return array('items'=>$serverItems,'counts'=>$totalItems); } function getMemcacheStats($total = true) { $resp = sendMemcacheCommands('stats'); if ($total){ $res = array(); foreach($resp as $server => $r) { foreach ($r['STAT'] as $key => $row) { if (!isset($res[$key])) { $res[$key] = null; } switch ($key){ case 'pid': $res['pid'][$server] = $row; break; case 'uptime': $res['uptime'][$server] = $row; break; case 'time': $res['time'][$server] = $row; break; case 'version': $res['version'][$server] = $row; break; case 'pointer_size': $res['pointer_size'][$server] = $row; break; case 'rusage_user': $res['rusage_user'][$server] = $row; break; case 'rusage_system': $res['rusage_system'][$server] = $row; break; case 'curr_items': $res['curr_items'] += $row; break; case 'total_items': $res['total_items'] += $row; break; case 'bytes': $res['bytes'] += $row; break; case 'curr_connections': $res['curr_connections'] += $row; break; case 'total_connections': $res['total_connections'] += $row; break; case 'connection_structures': $res['connection_structures'] += $row; break; case 'cmd_get': $res['cmd_get'] += $row; break; case 'cmd_set': $res['cmd_set'] += $row; break; case 'get_hits': $res['get_hits'] += $row; break; case 'get_misses': $res['get_misses'] += $row; break; case 'evictions': $res['evictions'] += $row; break; case 'bytes_read': $res['bytes_read'] += $row; break; case 'bytes_written': $res['bytes_written'] += $row; break; case 'limit_maxbytes': $res['limit_maxbytes'] += $row; break; case 'threads': $res['rusage_system'][$server]= $row; break; } } } return $res; } return $resp; } function duration($ts) { global $time; $years = (int) ((($time - $ts) / (7 * 86400)) / 52.177457); $rem = (int) (($time-$ts) - ($years * 52.177457 * 7 * 86400)); $weeks = (int) (($rem) / (7*86400)); $days = (int) (($rem) / 86400) - $weeks * 7; $hours = (int) (($rem) / 3600) - $days * 24 - $weeks * 7 * 24; $mins = (int) (($rem) / 60) - $hours * 60 - $days * 24 * 60 - $weeks * 7 * 24 * 60; $str = ''; if ($years == 1) { $str .= "$years year, "; } if ($years > 1) { $str .= "$years years, "; } if ($weeks == 1) { $str .= "$weeks week, "; } if ($weeks > 1) { $str .= "$weeks weeks, "; } if ($days == 1) { $str .= "$days day,"; } if ($days > 1) { $str .= "$days days,"; } if ($hours == 1) { $str .= " $hours hour and"; } if ($hours > 1) { $str .= " $hours hours and"; } if ($mins == 1) { $str .= " 1 minute"; } else { $str .= " $mins minutes"; } return $str; } // create graphics // function graphics_avail() { return extension_loaded('gd'); } function bsize($s) { foreach (array('', 'Ki', 'Mi', 'Gi', 'Ti') as $i => $k) { if ($s < 1024) { break; } $s /= 1024; } return sprintf("%5.1f %sBytes", $s, $k); } // create menu entry function menu_entry($ob, $title) { global $PHP_SELF; if ($ob == $_GET['op']) { return "
  • $title
  • "; } return "
  • $title
  • "; } function getHeader() { $header = << MEMCACHE INFO

    memcache.php by Harun Yayli


    EOB; return $header; } function getFooter(){ global $VERSION; $footer = '
    '; return $footer; } function getMenu() { global $PHP_SELF; echo "