File: /home/httpd/html/xdudes.com/admin/memcache.functions.php
<?php
/*
+----------------------------------------------------------------------+
| PHP Version 5 |
+----------------------------------------------------------------------+
| Copyright (c) 1997-2012 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.0 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.php.net/license/3_0.txt. |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Initial author: Harun Yayli <harunyayli at gmail.com> |
| Modifications by: Artur Ejsmont http://artur.ejsmont.org |
| Till Klampaeckel <till@php.net> |
+----------------------------------------------------------------------+
*/
if (!isset($VERSION)) {
echo "Not allowed.";
exit(1);
}
// create graphics
//
function graphics_avail() {
return extension_loaded('gd');
}
function bsize($s) {
foreach (array('', 'K', 'M', 'G') as $i => $k) {
if ($s < 1024)
break;
$s/=1024;
}
return sprintf("%5.1f %sBytes", $s, $k);
}
/**
* create menu entry
*
* @return string
*/
function menu_entry($ob, $title) {
$PHP_SELF = getUrl();
if ($ob == $_GET['op']) {
return "<li class=\"active\"><a href=\"{$PHP_SELF}&op={$ob}\">{$title}</a></li>";
}
return "<li><a href=\"{$PHP_SELF}&op={$ob}\">{$title}</a></li>";
}
/**
* Print the header when we run stand-alone.
*
* @return void
*/
function getHeader() {
$jq_core = JQ_CORE;
$jq_ts = JQ_TABLESORT;
$base_url = BASE_URL;
$PHP_SELF = getUrl();
$header = <<<EOT
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us">
<head><title>MEMCACHE INFO</title>
<link rel="stylesheet" href="{$base_url}js/style.css" type="text/css" />
<link rel="stylesheet" href="{$base_url}js/vtip/css/vtip.css" type="text/css" />
<script type="text/javascript" src="{$jq_core}"></script>
<script type="text/javascript" src="{$jq_ts}"></script>
<script type="text/javascript" src="{$base_url}js/vtip/vtip-min.js"></script>
<script type="text/javascript">
function must_confirm(txt, link){
if( confirm(txt) == true ){
document.location.href = link;
return true;
}else{
return false;
}
}
$(document).ready(function(){
$.tablesorter.defaults.widgets = ['zebra'];
$('#slabStats').tablesorter( {sortList: [[0,0], [1,0]]} );
});
/* console.debug(123); */
</script>
</head>
<body>
<div class="container">
<div class="navbar navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<a class="brand" href="{$PHP_SELF}">Memcache stats v0.X</a>
<ul class="nav pull-right">
<li><a href="http://github.com/lagged/memcache.php">Github</a></li>
<li><a href="http://artur.ejsmont.org">Arthur Ejsmont</a></li>
<li><a href="http://livebookmark.net/journal/2008/05/21/memcachephp-stats-like-apcphp/">Original memcache.php website</a></li>
</ul>
</div>
</div>
</div>
EOT;
return $header;
}
function getFooter() {
$footer = '</div>
</body>
</html>
';
return $footer;
}
function getMenu() {
$PHP_SELF = getUrl();
echo '<ul class="navMemcached tabs custom">';
if ($_GET['op'] != 4) {
echo <<<EOB
<li><a href="$PHP_SELF&op={$_GET['op']}" class="tab">Refresh Stats</a></li>
EOB;
} else {
echo <<<EOB
<li><a href="$PHP_SELF&op=2}" class="tab">Back</a></li>
EOB;
}
echo menu_entry(1, 'View Host Stats'),
menu_entry(2, 'Variables'),
menu_entry(8, 'Slabs');
echo <<<EOB
</ul>
EOB;
}
if (!isset($VERSION)) {
echo "Not allowed.";
exit(1);
}
///////////MEMCACHE FUNCTIONS /////////////////////////////////////////////////////////////////////
/**
* Return the URL to this script so we can
* adjust it via configuration.
*
* @return string
*/
function getUrl() {
$url = MEMCACHE_SCRIPT;
if (substr($url, -1) != '?') {
$url .= '?';
}
return $url;
}
function sendMemcacheCommands($command) {
$result = array();
foreach ($GLOBALS['MEMCACHE_SERVERS'] as $server) {
list($host, $port) = explode(':', $server);
$result[$server] = sendMemcacheCommand($host, $port, $command);
}
return $result;
}
function sendMemcacheCommand($server, $port, $command) {
$s = @fsockopen($server, $port);
if (!$s) {
die("Cant 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;
}
if (strpos($buf, "RESET\r\n") !== false) { // reset stats ok
break;
}
if (strpos($buf, "VERSION ") !== false) { // version answer
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 ($l[0] == 'VERSION') {
return $l[1];
} elseif ($line == 'DELETED' || $line == 'NOT_FOUND' || $line == 'OK' || $line == 'RESET') {
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 getAllSlabStats() {
$entries = sendMemcacheCommands('stats slabs');
$slabs = array();
foreach ($entries as $server => $stats) {
$slabs[$server] = array();
if (isset($stats['STAT'])) {
foreach ($stats['STAT'] as $keyinfo => $value) {
if (preg_match('/(\d+?)\:(.+?)$/', $keyinfo, $matches)) {
$slabs[$server][$matches[1]][$matches[2]] = $value;
}
}
}
}
return $slabs;
}
function flushStats($server) {
list($host, $port) = explode(':', $server);
$resp = sendMemcacheCommand($host, $port, 'stats reset');
return $resp;
}
function getMemcacheVersion() {
$entries = sendMemcacheCommands('version');
return $entries;
}
function flushServer($server) {
return;
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 fill_box($im, $x, $y, $w, $h, $color1, $color2, $text = '', $placeindex = '') {
global $col_black;
$x1 = $x + $w - 1;
$y1 = $y + $h - 1;
imagerectangle($im, $x, $y1, $x1 + 1, $y + 1, $col_black);
if ($y1 > $y)
imagefilledrectangle($im, $x, $y, $x1, $y1, $color2);
else
imagefilledrectangle($im, $x, $y1, $x1, $y, $color2);
imagerectangle($im, $x, $y1, $x1, $y, $color1);
if ($text) {
if ($placeindex > 0) {
if ($placeindex < 16) {
$px = 5;
$py = $placeindex * 12 + 6;
imagefilledrectangle($im, $px + 90, $py + 3, $px + 90 - 4, $py - 3, $color2);
imageline($im, $x, $y + $h / 2, $px + 90, $py, $color2);
imagestring($im, 2, $px, $py - 6, $text, $color1);
} else {
if ($placeindex < 31) {
$px = $x + 40 * 2;
$py = ($placeindex - 15) * 12 + 6;
} else {
$px = $x + 40 * 2 + 100 * intval(($placeindex - 15) / 15);
$py = ($placeindex % 15) * 12 + 6;
}
imagefilledrectangle($im, $px, $py + 3, $px - 4, $py - 3, $color2);
imageline($im, $x + $w, $y + $h / 2, $px, $py, $color2);
imagestring($im, 2, $px + 2, $py - 6, $text, $color1);
}
} else {
imagestring($im, 4, $x + 5, $y1 - 16, $text, $color1);
}
}
}
function fill_arc($im, $centerX, $centerY, $diameter, $start, $end, $color1, $color2, $text = '', $placeindex = 0) {
$r = $diameter / 2;
$w = deg2rad((360 + $start + ($end - $start) / 2) % 360);
if (function_exists("imagefilledarc")) {
// exists only if GD 2.0.1 is avaliable
imagefilledarc($im, $centerX + 1, $centerY + 1, $diameter, $diameter, $start, $end, $color1, IMG_ARC_PIE);
imagefilledarc($im, $centerX, $centerY, $diameter, $diameter, $start, $end, $color2, IMG_ARC_PIE);
imagefilledarc($im, $centerX, $centerY, $diameter, $diameter, $start, $end, $color1, IMG_ARC_NOFILL | IMG_ARC_EDGED);
} else {
imagearc($im, $centerX, $centerY, $diameter, $diameter, $start, $end, $color2);
imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($start)) * $r, $centerY + sin(deg2rad($start)) * $r, $color2);
imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($start + 1)) * $r, $centerY + sin(deg2rad($start)) * $r, $color2);
imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($end - 1)) * $r, $centerY + sin(deg2rad($end)) * $r, $color2);
imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($end)) * $r, $centerY + sin(deg2rad($end)) * $r, $color2);
imagefill($im, $centerX + $r * cos($w) / 2, $centerY + $r * sin($w) / 2, $color2);
}
if ($text) {
if ($placeindex > 0) {
imageline($im, $centerX + $r * cos($w) / 2, $centerY + $r * sin($w) / 2, $diameter, $placeindex * 12, $color1);
imagestring($im, 4, $diameter, $placeindex * 12, $text, $color1);
} else {
imagestring($im, 4, $centerX + $r * cos($w) / 2, $centerY + $r * sin($w) / 2, $text, $color1);
}
}
}
?>