基于Nginx的Mencached缓存配置详解

时间:2022-01-26 11:26:00

简介

memcached是一套分布式的高速缓存系统,memcached缺乏认证以及安全管制,这代表应该将memcached服务器放置在防火墙后。memcached的API使用三十二比特的循环冗余校验(CRC-32)计算键值后,将数据分散在不同的机器上。当表格满了以后,接下来新增的数据会以LRU机制替换掉。由于memcached通常只是当作缓存系统使用,所以使用memcached的应用程序在写回较慢的系统时(像是后端的数据库)需要额外的代码更新memcached内的数据

特征

memcached作为高速运行的分布式缓存服务器,具有以下的特点:

  • 协议简单
  • 基于libevent的事件处理
  • 内置内存存储方式
  • memcached不互相通信的分布式

前期准备

准备三台Centos7虚拟机,配置IP地址和hostname,关闭防火墙和selinux,同步系统时间,修改IP地址和hostname映射

 

ip hostname
192.168.29.132 master
192.168.29.138 bak
192.168.29.133 mid

 

master和bak机器部署Nginx和PHP

部署memcache

mid机器部署memcached客户端

?
1
2
3
4
5
6
7
8
9
10
11
[root@mid ~]# yum install memcached -y
#启动服务
[root@mid ~]# systemctl start memcached.service
 
#查看启动情况,点击回车出现ERROR则启动成功
[root@master ~]# telnet 192.168.29.133 11211
Trying 192.168.29.133...
Connected to 192.168.29.133.
Escape character is '^]'.
 
ERROR

master和mid机器部署PHP的memcached扩展

下载libmemcached和memcached压缩包

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#解压并安装libmemcached
[root@master ~]#tar -xvf libmemcached-1.0.18.tar.gz
[root@master ~]#cd libmemcached-1.0.18
#若编译报错,将clients/memflush.cc中报错相应位置的false改为NULL
[root@master ~]#./configure --prefix=/usr/local/libmemcached
make && make install
 
#解压并安装memcached
[root@master ~]#tar -zxvf memcached-3.1.5.tgz
[root@master ~]#cd memcached-3.1.5
[root@master ~]#phpize
[root@master ~]#./configure --with-libmemcached-dir=/usr/local/libmemcached --disable-memcached-sasl
[root@master ~]#make && make install
 
#完成后观察php目录下的lib/php/extensions/no-debug-zts-20170718/是否有扩展
memcached.so
 
#添加扩展至php配置文件
[root@master ~]# vi /usr/local/php/etc/php.ini
extension=memcached.so

测试验证

?
1
2
3
4
[root@master ~]# vi /usr/local/nginx/html/test.php
<?php
phpinfo();
?>

访问http://ip/test.php

基于Nginx的Mencached缓存配置详解

注:bak机器进行相同操作

配置缓存

配置Nginx配置文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[root@master ~]# cat /usr/local/nginx/conf/nginx.conf
worker_processes 1;
events {
  worker_connections 1024;
}
http {
  include    mime.types;
  default_type application/octet-stream;
  sendfile    on;
  keepalive_timeout 65;
  server {
    listen    80;
    server_name localhost;
    location / {
      root  html;
      index index.html index.htm;
    }
  #memcached缓存配置,有缓存则读取,没有缓存则报404错误
  location /demo/ {
    set $memcached_key $request_uri;
    add_header X-mem-key $memcached_key;
    memcached_pass 192.168.29.133:11211;
    default_type text/html;
    #报错后转到特定Location
    error_page 404 502 504 = @mymemcached;
  }
  #配置重写策略执行特定php文件
  location @mymemcached {
    rewrite .* /demo.php?key=$request_uri;
  }
    location ~ .php$ {
      root      html;
      fastcgi_pass  127.0.0.1:9000;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      include    fastcgi_params;
    }
  }
}

编写PHP文件设置memcached缓存

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#创建demo文件夹
[root@master ~] mkdir /usr/local/nginx/html/demo
#创建测试文件
[root@master ~] echo "123" >> /usr/local/nginx/html/demo/123.html
 
[root@master ~]# vi /usr/local/nginx/html/demo.php
<?php
  $fn=dirname(__FILE__) . $_SERVER['REQUEST_URI'];
  if(file_exists($fn)){
    $data=file_get_contents($fn);
    $m=new Memcached();
    $server=array(
      array('192.168.29.133',11211)
    );
    $m->addServers($server);
    $r=$m->set($_GET['key'],$data);
    header('Content-Length:'.filesize($fn)." ");
    header('Content-Type:file'." ");
    header('X-cache:MISS:'." ");
    echo $data;
  }
  #不存在demo文件夹则返回首页
  else{
    header('Location:../index.html'." ");
  }
?>

注:bak机器进行相同的设置

测试验证

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#可看出第一次memcache中没有缓存,第二次击中缓存
[root@bak ~]# curl -I http://192.168.29.132/demo/123.html
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Thu, 25 Jun 2020 02:23:00 GMT
Content-Type: file
Content-Length: 4
Connection: keep-alive
X-Powered-By: PHP/7.2.26
X-cache: MISS:
 
[root@bak ~]# curl -I http://192.168.29.132/demo/123.html
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Thu, 25 Jun 2020 02:23:01 GMT
Content-Type: text/html
Content-Length: 4
Connection: keep-alive
X-mem-key: /demo/123.html
Accept-Ranges: bytes
 
#当设置缓存后,访问相同的缓存key时,即使发起访问的机器不相同也同样能击中缓存
[root@master ~]# curl -I http://192.168.29.138/demo/123.html
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Thu, 25 Jun 2020 02:29:46 GMT
Content-Type: text/html
Content-Length: 4
Connection: keep-alive
X-mem-key: /demo/123.html
Accept-Ranges: bytes

查看memcached缓存状态

基于Nginx的Mencached缓存配置详解

基于Nginx的Mencached缓存配置详解

memcached监控文件

  1. <?php 
  2. /* 
  3.  +----------------------------------------------------------------------+ 
  4.  | PHP Version 5                            | 
  5.  +----------------------------------------------------------------------+ 
  6.  | Copyright (c) 1997-2004 The PHP Group                | 
  7.  +----------------------------------------------------------------------+ 
  8.  | This source file is subject to version 3.0 of the PHP license,    | 
  9.  | that is bundled with this package in the file LICENSE, and is    | 
  10.  | available through the world-wide-web at the following url:      | 
  11.  | http://www.php.net/license/3_0.txt.                 | 
  12.  | If you did not receive a copy of the PHP license and are unable to  | 
  13.  | obtain it through the world-wide-web, please send a note to     | 
  14.  | license@php.net so we can mail you a copy immediately.        | 
  15.  +----------------------------------------------------------------------+ 
  16.  | Author: Harun Yayli <harunyayli at gmail.com>            | 
  17.  +----------------------------------------------------------------------+ 
  18. */ 
  19. //memcached图形化小工具 
  20. $VERSION='$Id: memcache.php,v 1.1.2.3 2008/08/28 18:07:54 mikl Exp $'
  21. #设置用户名 
  22. define('ADMIN_USERNAME','admin'); 
  23. #设置密码 
  24. define('ADMIN_PASSWORD','123456'); 
  25.  
  26. define('DATE_FORMAT','Y/m/d H:i:s'); 
  27. define('GRAPH_SIZE',200); 
  28. define('MAX_ITEM_DUMP',50); 
  29.  
  30. #设置memcached主机信息 
  31. $MEMCACHE_SERVERS[] = '192.168.29.133:11211'
  32.  
  33. ////////// END OF DEFAULT CONFIG AREA ///////////////////////////////////////////////////////////// 
  34.  
  35. ///////////////// Password protect //////////////////////////////////////////////////////////////// 
  36. if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) || 
  37.       $_SERVER['PHP_AUTH_USER'] != ADMIN_USERNAME ||$_SERVER['PHP_AUTH_PW'] != ADMIN_PASSWORD) { 
  38.       Header("WWW-Authenticate: Basic realm="Memcache Login""); 
  39.       Header("HTTP/1.0 401 Unauthorized"); 
  40.  
  41.       echo <<<EOB 
  42.         <html><body> 
  43.         <h1>Rejected!</h1> 
  44.         <big>Wrong Username or Password!</big> 
  45.         </body></html> 
  46. EOB; 
  47.       exit; 
  48.  
  49. ///////////MEMCACHE FUNCTIONS ///////////////////////////////////////////////////////////////////// 
  50.  
  51. function sendMemcacheCommands($command){ 
  52.   global $MEMCACHE_SERVERS; 
  53.   $result = array(); 
  54.  
  55.   foreach($MEMCACHE_SERVERS as $server){ 
  56.     $strs = explode(':',$server); 
  57.     $host = $strs[0]; 
  58.     $port = $strs[1]; 
  59.     $result[$server] = sendMemcacheCommand($host,$port,$command); 
  60.   } 
  61.   return $result; 
  62. function sendMemcacheCommand($server,$port,$command){ 
  63.  
  64.   $s = @fsockopen($server,$port); 
  65.   if (!$s){ 
  66.     die("Cant connect to:".$server.':'.$port); 
  67.   } 
  68.  
  69.   fwrite($s, $command." "); 
  70.  
  71.   $buf=''
  72.   while ((!feof($s))) { 
  73.     $buf .= fgets($s, 256); 
  74.     if (strpos($buf,"END ")!==false){ // stat says end 
  75.       break
  76.     } 
  77.     if (strpos($buf,"DELETED ")!==false || strpos($buf,"NOT_FOUND ")!==false){ // delete says these 
  78.       break
  79.     } 
  80.     if (strpos($buf,"OK ")!==false){ // flush_all says ok 
  81.       break
  82.     } 
  83.   } 
  84.   fclose($s); 
  85.   return parseMemcacheResults($buf); 
  86. function parseMemcacheResults($str){ 
  87.  
  88.   $res = array(); 
  89.   $lines = explode(" ",$str); 
  90.   $cnt = count($lines); 
  91.   for($i=0; $i< $cnt; $i++){ 
  92.     $line = $lines[$i]; 
  93.     $l = explode(' ',$line,3); 
  94.     if (count($l)==3){ 
  95.       $res[$l[0]][$l[1]]=$l[2]; 
  96.       if ($l[0]=='VALUE'){ // next line is the value 
  97.         $res[$l[0]][$l[1]] = array(); 
  98.         list ($flag,$size)=explode(' ',$l[2]); 
  99.         $res[$l[0]][$l[1]]['stat']=array('flag'=>$flag,'size'=>$size); 
  100.         $res[$l[0]][$l[1]]['value']=$lines[++$i]; 
  101.       } 
  102.     }elseif($line=='DELETED' || $line=='NOT_FOUND' || $line=='OK'){ 
  103.       return $line; 
  104.     } 
  105.   } 
  106.   return $res; 
  107.  
  108.  
  109. function dumpCacheSlab($server,$slabId,$limit){ 
  110.   list($host,$port) = explode(':',$server); 
  111.   $resp = sendMemcacheCommand($host,$port,'stats cachedump '.$slabId.' '.$limit); 
  112.  
  113.   return $resp; 
  114.  
  115.  
  116. function flushServer($server){ 
  117.   list($host,$port) = explode(':',$server); 
  118.   $resp = sendMemcacheCommand($host,$port,'flush_all'); 
  119.   return $resp; 
  120. function getCacheItems(){ 
  121.  $items = sendMemcacheCommands('stats items'); 
  122.  $serverItems = array(); 
  123.  $totalItems = array(); 
  124.  foreach ($items as $server=>$itemlist){ 
  125.   $serverItems[$server] = array(); 
  126.   $totalItems[$server]=0; 
  127.   if (!isset($itemlist['STAT'])){ 
  128.     continue
  129.   } 
  130.  
  131.   $iteminfo = $itemlist['STAT']; 
  132.  
  133.   foreach($iteminfo as $keyinfo=>$value){ 
  134.     if (preg_match('/items:(d+?):(.+?)$/',$keyinfo,$matches)){ 
  135.       $serverItems[$server][$matches[1]][$matches[2]] = $value; 
  136.       if ($matches[2]=='number'){ 
  137.         $totalItems[$server] +=$value; 
  138.       } 
  139.     } 
  140.   } 
  141.  } 
  142.  return array('items'=>$serverItems,'counts'=>$totalItems); 
  143. function getMemcacheStats($total=true){ 
  144.   $resp = sendMemcacheCommands('stats'); 
  145.   if ($total){ 
  146.     $res = array(); 
  147.     foreach($resp as $server=>$r){ 
  148.       foreach($r['STAT'] as $key=>$row){ 
  149.         if (!isset($res[$key])){ 
  150.           $res[$key]=null
  151.         } 
  152.         switch ($key){ 
  153.           case 'pid'
  154.             $res['pid'][$server]=$row; 
  155.             break
  156.           case 'uptime'
  157.             $res['uptime'][$server]=$row; 
  158.             break
  159.           case 'time'
  160.             $res['time'][$server]=$row; 
  161.             break
  162.           case 'version'
  163.             $res['version'][$server]=$row; 
  164.             break
  165.           case 'pointer_size'
  166.             $res['pointer_size'][$server]=$row; 
  167.             break
  168.           case 'rusage_user'
  169.             $res['rusage_user'][$server]=$row; 
  170.             break
  171.           case 'rusage_system'
  172.             $res['rusage_system'][$server]=$row; 
  173.             break
  174.           case 'curr_items'
  175.             $res['curr_items']+=$row; 
  176.             break
  177.           case 'total_items'
  178.             $res['total_items']+=$row; 
  179.             break
  180.           case 'bytes'
  181.             $res['bytes']+=$row; 
  182.             break
  183.           case 'curr_connections'
  184.             $res['curr_connections']+=$row; 
  185.             break
  186.           case 'total_connections'
  187.             $res['total_connections']+=$row; 
  188.             break
  189.           case 'connection_structures'
  190.             $res['connection_structures']+=$row; 
  191.             break
  192.           case 'cmd_get'
  193.             $res['cmd_get']+=$row; 
  194.             break
  195.           case 'cmd_set'
  196.             $res['cmd_set']+=$row; 
  197.             break
  198.           case 'get_hits'
  199.             $res['get_hits']+=$row; 
  200.             break
  201.           case 'get_misses'
  202.             $res['get_misses']+=$row; 
  203.             break
  204.           case 'evictions'
  205.             $res['evictions']+=$row; 
  206.             break
  207.           case 'bytes_read'
  208.             $res['bytes_read']+=$row; 
  209.             break
  210.           case 'bytes_written'
  211.             $res['bytes_written']+=$row; 
  212.             break
  213.           case 'limit_maxbytes'
  214.             $res['limit_maxbytes']+=$row; 
  215.             break
  216.           case 'threads'
  217.             $res['rusage_system'][$server]=$row; 
  218.             break
  219.         } 
  220.       } 
  221.     } 
  222.     return $res; 
  223.   } 
  224.   return $resp; 
  225.  
  226. ////////////////////////////////////////////////////// 
  227.  
  228. // 
  229. // don't cache this page 
  230. // 
  231. header("Cache-Control: no-store, no-cache, must-revalidate"); // HTTP/1.1 
  232. header("Cache-Control: post-check=0, pre-check=0"false); 
  233. header("Pragma: no-cache");                  // HTTP/1.0 
  234.  
  235. function duration($ts) { 
  236.   global $time; 
  237.   $years = (int)((($time - $ts)/(7*86400))/52.177457); 
  238.   $rem = (int)(($time-$ts)-($years * 52.177457 * 7 * 86400)); 
  239.   $weeks = (int)(($rem)/(7*86400)); 
  240.   $days = (int)(($rem)/86400) - $weeks*7; 
  241.   $hours = (int)(($rem)/3600) - $days*24 - $weeks*7*24; 
  242.   $mins = (int)(($rem)/60) - $hours*60 - $days*24*60 - $weeks*7*24*60; 
  243.   $str = ''
  244.   if($years==1) $str .= "$years year, "
  245.   if($years>1) $str .= "$years years, "
  246.   if($weeks==1) $str .= "$weeks week, "
  247.   if($weeks>1) $str .= "$weeks weeks, "
  248.   if($days==1) $str .= "$days day,"
  249.   if($days>1) $str .= "$days days,"
  250.   if($hours == 1) $str .= " $hours hour and"
  251.   if($hours>1) $str .= " $hours hours and"
  252.   if($mins == 1) $str .= " 1 minute"
  253.   else $str .= " $mins minutes"
  254.   return $str; 
  255.  
  256. // create graphics 
  257. // 
  258. function graphics_avail() { 
  259.   return extension_loaded('gd'); 
  260.  
  261. function bsize($s) { 
  262.   foreach (array('','K','M','G') as $i => $k) { 
  263.     if ($s < 1024) break
  264.     $s/=1024; 
  265.   } 
  266.   return sprintf("%5.1f %sBytes",$s,$k); 
  267.  
  268. // create menu entry 
  269. function menu_entry($ob,$title) { 
  270.   global $PHP_SELF; 
  271.   if ($ob==$_GET['op']){ 
  272.     return "<li><a class="child_active" href="$PHP_SELF&op=$ob">$title</a></li>"
  273.   } 
  274.   return "<li><a class="active" href="$PHP_SELF&op=$ob">$title</a></li>"
  275.  
  276. function getHeader(){ 
  277.   $header = <<<EOB 
  278. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  279. <html> 
  280. <head><title>MEMCACHE INFO</title> 
  281. <style type="text/css"><!-- 
  282. body { background:white; font-size:100.01%; margin:0; padding:0; } 
  283. body,p,td,th,input,submit { font-size:0.8em;font-family:arial,helvetica,sans-serif; } 
  284. * html body  {font-size:0.8em} 
  285. * html p   {font-size:0.8em} 
  286. * html td   {font-size:0.8em} 
  287. * html th   {font-size:0.8em} 
  288. * html input {font-size:0.8em} 
  289. * html submit {font-size:0.8em} 
  290. td { vertical-align:top } 
  291. a { color:black; font-weight:none; text-decoration:none; } 
  292. a:hover { text-decoration:underline; } 
  293. div.content { padding:1em 1em 1em 1em; position:absolute; width:97%; z-index:100; } 
  294.  
  295. h1.memcache { background:rgb(153,153,204); margin:0; padding:0.5em 1em 0.5em 1em; } 
  296. * html h1.memcache { margin-bottom:-7px; } 
  297. h1.memcache a:hover { text-decoration:none; color:rgb(90,90,90); } 
  298. h1.memcache span.logo { 
  299.   background:rgb(119,123,180); 
  300.   color:black; 
  301.   border-right: solid black 1px; 
  302.   border-bottom: solid black 1px; 
  303.   font-style:italic; 
  304.   font-size:1em; 
  305.   padding-left:1.2em; 
  306.   padding-right:1.2em; 
  307.   text-align:right; 
  308.   display:block; 
  309.   width:130px; 
  310.   } 
  311. h1.memcache span.logo span.name { color:white; font-size:0.7em; padding:0 0.8em 0 2em; } 
  312. h1.memcache span.nameinfo { color:white; display:inline; font-size:0.4em; margin-left: 3em; } 
  313. h1.memcache div.copy { color:black; font-size:0.4em; position:absolute; right:1em; } 
  314. hr.memcache { 
  315.   background:white; 
  316.   border-bottom:solid rgb(102,102,153) 1px; 
  317.   border-style:none; 
  318.   border-top:solid rgb(102,102,153) 10px; 
  319.   height:12px; 
  320.   margin:0; 
  321.   margin-top:1px; 
  322.   padding:0; 
  323.  
  324. ol,menu { margin:1em 0 0 0; padding:0.2em; margin-left:1em;} 
  325. ol.menu li { display:inline; margin-right:0.7em; list-style:none; font-size:85%} 
  326. ol.menu a { 
  327.   background:rgb(153,153,204); 
  328.   border:solid rgb(102,102,153) 2px; 
  329.   color:white; 
  330.   font-weight:bold; 
  331.   margin-right:0em; 
  332.   padding:0.1em 0.5em 0.1em 0.5em; 
  333.   text-decoration:none; 
  334.   margin-left: 5px; 
  335.   } 
  336. ol.menu a.child_active { 
  337.   background:rgb(153,153,204); 
  338.   border:solid rgb(102,102,153) 2px; 
  339.   color:white; 
  340.   font-weight:bold; 
  341.   margin-right:0em; 
  342.   padding:0.1em 0.5em 0.1em 0.5em; 
  343.   text-decoration:none; 
  344.   border-left: solid black 5px; 
  345.   margin-left: 0px; 
  346.   } 
  347. ol.menu span.active { 
  348.   background:rgb(153,153,204); 
  349.   border:solid rgb(102,102,153) 2px; 
  350.   color:black; 
  351.   font-weight:bold; 
  352.   margin-right:0em; 
  353.   padding:0.1em 0.5em 0.1em 0.5em; 
  354.   text-decoration:none; 
  355.   border-left: solid black 5px; 
  356.   } 
  357. ol.menu span.inactive { 
  358.   background:rgb(193,193,244); 
  359.   border:solid rgb(182,182,233) 2px; 
  360.   color:white; 
  361.   font-weight:bold; 
  362.   margin-right:0em; 
  363.   padding:0.1em 0.5em 0.1em 0.5em; 
  364.   text-decoration:none; 
  365.   margin-left: 5px; 
  366.   } 
  367. ol.menu a:hover { 
  368.   background:rgb(193,193,244); 
  369.   text-decoration:none; 
  370.   } 
  371.  
  372. div.info { 
  373.   background:rgb(204,204,204); 
  374.   border:solid rgb(204,204,204) 1px; 
  375.   margin-bottom:1em; 
  376.   } 
  377. div.info h2 { 
  378.   background:rgb(204,204,204); 
  379.   color:black; 
  380.   font-size:1em; 
  381.   margin:0; 
  382.   padding:0.1em 1em 0.1em 1em; 
  383.   } 
  384. div.info table { 
  385.   border:solid rgb(204,204,204) 1px; 
  386.   border-spacing:0; 
  387.   width:100%; 
  388.   } 
  389. div.info table th { 
  390.   background:rgb(204,204,204); 
  391.   color:white; 
  392.   margin:0; 
  393.   padding:0.1em 1em 0.1em 1em; 
  394.   } 
  395. div.info table th a.sortable { color:black; } 
  396. div.info table tr.tr-0 { background:rgb(238,238,238); } 
  397. div.info table tr.tr-1 { background:rgb(221,221,221); } 
  398. div.info table td { padding:0.3em 1em 0.3em 1em; } 
  399. div.info table td.td-0 { border-right:solid rgb(102,102,153) 1px; white-space:nowrap; } 
  400. div.info table td.td-n { border-right:solid rgb(102,102,153) 1px; } 
  401. div.info table td h3 { 
  402.   color:black; 
  403.   font-size:1.1em; 
  404.   margin-left:-0.3em; 
  405.   } 
  406. .td-0 a , .td-n a, .tr-0 a , tr-1 a { 
  407.   text-decoration:underline; 
  408. div.graph { margin-bottom:1em } 
  409. div.graph h2 { background:rgb(204,204,204);; color:black; font-size:1em; margin:0; padding:0.1em 1em 0.1em 1em; } 
  410. div.graph table { border:solid rgb(204,204,204) 1px; color:black; font-weight:normal; width:100%; } 
  411. div.graph table td.td-0 { background:rgb(238,238,238); } 
  412. div.graph table td.td-1 { background:rgb(221,221,221); } 
  413. div.graph table td { padding:0.2em 1em 0.4em 1em; } 
  414.  
  415. div.div1,div.div2 { margin-bottom:1em; width:35em; } 
  416. div.div3 { position:absolute; left:40em; top:1em; width:580px; } 
  417. //div.div3 { position:absolute; left:37em; top:1em; right:1em; } 
  418.  
  419. div.sorting { margin:1.5em 0em 1.5em 2em } 
  420. .center { text-align:center } 
  421. .aright { position:absolute;right:1em } 
  422. .right { text-align:right } 
  423. .ok { color:rgb(0,200,0); font-weight:bold} 
  424. .failed { color:rgb(200,0,0); font-weight:bold} 
  425.  
  426. span.box { 
  427.   border: black solid 1px; 
  428.   border-right:solid black 2px; 
  429.   border-bottom:solid black 2px; 
  430.   padding:0 0.5em 0 0.5em; 
  431.   margin-right:1em; 
  432. span.green { background:#60F060; padding:0 0.5em 0 0.5em} 
  433. span.red { background:#D06030; padding:0 0.5em 0 0.5em } 
  434.  
  435. div.authneeded { 
  436.   background:rgb(238,238,238); 
  437.   border:solid rgb(204,204,204) 1px; 
  438.   color:rgb(200,0,0); 
  439.   font-size:1.2em; 
  440.   font-weight:bold; 
  441.   padding:2em; 
  442.   text-align:center; 
  443.   } 
  444.  
  445. input { 
  446.   background:rgb(153,153,204); 
  447.   border:solid rgb(102,102,153) 2px; 
  448.   color:white; 
  449.   font-weight:bold; 
  450.   margin-right:1em; 
  451.   padding:0.1em 0.5em 0.1em 0.5em; 
  452.   } 
  453. //--> 
  454. </style> 
  455. </head> 
  456. <body> 
  457. <div class="head"
  458.   <h1 class="memcache"
  459.     <span class="logo"><a href="http://pecl.php.net/package/memcache" rel="external nofollow" >memcache</a></span> 
  460.     <span class="nameinfo">memcache.php by <a href="http://livebookmark.net" rel="external nofollow" >Harun Yayli</a></span> 
  461.   </h1> 
  462.   <hr class="memcache"
  463. </div> 
  464. <div class=content> 
  465. EOB; 
  466.  
  467.   return $header; 
  468. function getFooter(){ 
  469.   global $VERSION; 
  470.   $footer = '</div><!-- Based on apc.php '.$VERSION.'--></body> 
  471. </html> 
  472. '; 
  473.  
  474.   return $footer; 
  475.  
  476. function getMenu(){ 
  477.   global $PHP_SELF; 
  478. echo "<ol class=menu>"
  479. if ($_GET['op']!=4){ 
  480. echo <<<EOB 
  481.   <li><a href="$PHP_SELF&op={$_GET['op']}" rel="external nofollow" >Refresh Data</a></li> 
  482. EOB; 
  483. else { 
  484. echo <<<EOB 
  485.   <li><a href="$PHP_SELF&op=2}" rel="external nofollow" >Back</a></li> 
  486. EOB; 
  487. echo 
  488.   menu_entry(1,'View Host Stats'), 
  489.   menu_entry(2,'Variables'); 
  490.  
  491. echo <<<EOB 
  492.   </ol> 
  493.   <br/> 
  494. EOB; 
  495.  
  496. // TODO, AUTH 
  497.  
  498. $_GET['op'] = !isset($_GET['op'])? '1':$_GET['op']; 
  499. $PHP_SELF= isset($_SERVER['PHP_SELF']) ? htmlentities(strip_tags($_SERVER['PHP_SELF'],'')) : ''
  500.  
  501. $PHP_SELF=$PHP_SELF.'?'
  502. $time = time(); 
  503. // sanitize _GET 
  504.  
  505. foreach($_GET as $key=>$g){ 
  506.   $_GET[$key]=htmlentities($g); 
  507.  
  508. // singleout 
  509. // when singleout is set, it only gives details for that server. 
  510. if (isset($_GET['singleout']) && $_GET['singleout']>=0 && $_GET['singleout'] <count($MEMCACHE_SERVERS)){ 
  511.   $MEMCACHE_SERVERS = array($MEMCACHE_SERVERS[$_GET['singleout']]); 
  512.  
  513. // display images 
  514. if (isset($_GET['IMG'])){ 
  515.   $memcacheStats = getMemcacheStats(); 
  516.   $memcacheStatsSingle = getMemcacheStats(false); 
  517.  
  518.   if (!graphics_avail()) { 
  519.     exit(0); 
  520.   } 
  521.  
  522.   function fill_box($im, $x, $y, $w, $h, $color1, $color2,$text='',$placeindex='') { 
  523.     global $col_black; 
  524.     $x1=$x+$w-1; 
  525.     $y1=$y+$h-1; 
  526.  
  527.     imagerectangle($im, $x, $y1, $x1+1, $y+1, $col_black); 
  528.     if($y1>$y) imagefilledrectangle($im, $x, $y, $x1, $y1, $color2); 
  529.     else imagefilledrectangle($im, $x, $y1, $x1, $y, $color2); 
  530.     imagerectangle($im, $x, $y1, $x1, $y, $color1); 
  531.     if ($text) { 
  532.       if ($placeindex>0) { 
  533.  
  534.         if ($placeindex<16) 
  535.         { 
  536.           $px=5; 
  537.           $py=$placeindex*12+6; 
  538.           imagefilledrectangle($im, $px+90, $py+3, $px+90-4, $py-3, $color2); 
  539.           imageline($im,$x,$y+$h/2,$px+90,$py,$color2); 
  540.           imagestring($im,2,$px,$py-6,$text,$color1); 
  541.  
  542.         } else { 
  543.           if ($placeindex<31) { 
  544.             $px=$x+40*2; 
  545.             $py=($placeindex-15)*12+6; 
  546.           } else { 
  547.             $px=$x+40*2+100*intval(($placeindex-15)/15); 
  548.             $py=($placeindex%15)*12+6; 
  549.           } 
  550.           imagefilledrectangle($im, $px, $py+3, $px-4, $py-3, $color2); 
  551.           imageline($im,$x+$w,$y+$h/2,$px,$py,$color2); 
  552.           imagestring($im,2,$px+2,$py-6,$text,$color1); 
  553.         } 
  554.       } else { 
  555.         imagestring($im,4,$x+5,$y1-16,$text,$color1); 
  556.       } 
  557.     } 
  558.   } 
  559.  
  560.   function fill_arc($im, $centerX, $centerY, $diameter, $start, $end, $color1,$color2,$text='',$placeindex=0) { 
  561.     $r=$diameter/2; 
  562.     $w=deg2rad((360+$start+($end-$start)/2)%360); 
  563.  
  564.     if (function_exists("imagefilledarc")) { 
  565.       // exists only if GD 2.0.1 is avaliable 
  566.       imagefilledarc($im, $centerX+1, $centerY+1, $diameter, $diameter, $start, $end, $color1, IMG_ARC_PIE); 
  567.       imagefilledarc($im, $centerX, $centerY, $diameter, $diameter, $start, $end, $color2, IMG_ARC_PIE); 
  568.       imagefilledarc($im, $centerX, $centerY, $diameter, $diameter, $start, $end, $color1, IMG_ARC_NOFILL|IMG_ARC_EDGED); 
  569.     } else { 
  570.       imagearc($im, $centerX, $centerY, $diameter, $diameter, $start, $end, $color2); 
  571.       imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($start)) * $r, $centerY + sin(deg2rad($start)) * $r, $color2); 
  572.       imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($start+1)) * $r, $centerY + sin(deg2rad($start)) * $r, $color2); 
  573.       imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($end-1))  * $r, $centerY + sin(deg2rad($end))  * $r, $color2); 
  574.       imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($end))  * $r, $centerY + sin(deg2rad($end))  * $r, $color2); 
  575.       imagefill($im,$centerX + $r*cos($w)/2, $centerY + $r*sin($w)/2, $color2); 
  576.     } 
  577.     if ($text) { 
  578.       if ($placeindex>0) { 
  579.         imageline($im,$centerX + $r*cos($w)/2, $centerY + $r*sin($w)/2,$diameter, $placeindex*12,$color1); 
  580.         imagestring($im,4,$diameter, $placeindex*12,$text,$color1); 
  581.  
  582.       } else { 
  583.         imagestring($im,4,$centerX + $r*cos($w)/2, $centerY + $r*sin($w)/2,$text,$color1); 
  584.       } 
  585.     } 
  586.   } 
  587.   $size = GRAPH_SIZE; // image size 
  588.   $image = imagecreate($size+50, $size+10); 
  589.  
  590.   $col_white = imagecolorallocate($image, 0xFF, 0xFF, 0xFF); 
  591.   $col_red  = imagecolorallocate($image, 0xD0, 0x60, 0x30); 
  592.   $col_green = imagecolorallocate($image, 0x60, 0xF0, 0x60); 
  593.   $col_black = imagecolorallocate($image,  0,  0,  0); 
  594.  
  595.   imagecolortransparent($image,$col_white); 
  596.  
  597.   switch ($_GET['IMG']){ 
  598.     case 1: // pie chart 
  599.       $tsize=$memcacheStats['limit_maxbytes']; 
  600.       $avail=$tsize-$memcacheStats['bytes']; 
  601.       $x=$y=$size/2; 
  602.       $angle_from = 0; 
  603.       $fuzz = 0.000001; 
  604.  
  605.       foreach($memcacheStatsSingle as $serv=>$mcs) { 
  606.         $free = $mcs['STAT']['limit_maxbytes']-$mcs['STAT']['bytes']; 
  607.         $used = $mcs['STAT']['bytes']; 
  608.  
  609.         if ($free>0){ 
  610.         // draw free 
  611.           $angle_to = ($free*360)/$tsize; 
  612.           $perc =sprintf("%.2f%%", ($free *100) / $tsize) ; 
  613.  
  614.           fill_arc($image,$x,$y,$size,$angle_from,$angle_from + $angle_to ,$col_black,$col_green,$perc); 
  615.           $angle_from = $angle_from + $angle_to ; 
  616.         } 
  617.         if ($used>0){ 
  618.         // draw used 
  619.           $angle_to = ($used*360)/$tsize; 
  620.           $perc =sprintf("%.2f%%", ($used *100) / $tsize) ; 
  621.           fill_arc($image,$x,$y,$size,$angle_from,$angle_from + $angle_to ,$col_black,$col_red, '('.$perc.')' ); 
  622.           $angle_from = $angle_from+ $angle_to ; 
  623.         } 
  624.         } 
  625.  
  626.     break
  627.  
  628.     case 2: // hit miss 
  629.  
  630.       $hits = ($memcacheStats['get_hits']==0) ? 1:$memcacheStats['get_hits']; 
  631.       $misses = ($memcacheStats['get_misses']==0) ? 1:$memcacheStats['get_misses']; 
  632.       $total = $hits + $misses ; 
  633.  
  634.       fill_box($image, 30,$size,50,-$hits*($size-21)/$total,$col_black,$col_green,sprintf("%.1f%%",$hits*100/$total)); 
  635.       fill_box($image,130,$size,50,-max(4,($total-$hits)*($size-21)/$total),$col_black,$col_red,sprintf("%.1f%%",$misses*100/$total)); 
  636.     break
  637.  
  638.   } 
  639.   header("Content-type: image/png"); 
  640.   imagepng($image); 
  641.   exit; 
  642.  
  643. echo getHeader(); 
  644. echo getMenu(); 
  645.  
  646. switch ($_GET['op']) { 
  647.  
  648.   case 1: // host stats 
  649.     $phpversion = phpversion(); 
  650.     $memcacheStats = getMemcacheStats(); 
  651.     $memcacheStatsSingle = getMemcacheStats(false); 
  652.  
  653.     $mem_size = $memcacheStats['limit_maxbytes']; 
  654.     $mem_used = $memcacheStats['bytes']; 
  655.     $mem_avail= $mem_size-$mem_used; 
  656.     $startTime = time()-array_sum($memcacheStats['uptime']); 
  657.  
  658.     $curr_items = $memcacheStats['curr_items']; 
  659.     $total_items = $memcacheStats['total_items']; 
  660.     $hits = ($memcacheStats['get_hits']==0) ? 1:$memcacheStats['get_hits']; 
  661.     $misses = ($memcacheStats['get_misses']==0) ? 1:$memcacheStats['get_misses']; 
  662.     $sets = $memcacheStats['cmd_set']; 
  663.  
  664.     $req_rate = sprintf("%.2f",($hits+$misses)/($time-$startTime)); 
  665.     $hit_rate = sprintf("%.2f",($hits)/($time-$startTime)); 
  666.     $miss_rate = sprintf("%.2f",($misses)/($time-$startTime)); 
  667.     $set_rate = sprintf("%.2f",($sets)/($time-$startTime)); 
  668.  
  669.     echo <<< EOB 
  670.     <div class="info div1"><h2>General Cache Information</h2> 
  671.     <table cellspacing=0><tbody> 
  672.     <tr class=tr-1><td class=td-0>PHP Version</td><td>$phpversion</td></tr> 
  673. EOB; 
  674.     echo "<tr class=tr-0><td class=td-0>Memcached Host". ((count($MEMCACHE_SERVERS)>1) ? 's':'')."</td><td>"
  675.     $i=0; 
  676.     if (!isset($_GET['singleout']) && count($MEMCACHE_SERVERS)>1){ 
  677.       foreach($MEMCACHE_SERVERS as $server){ 
  678.          echo ($i+1).'. <a href="'.$PHP_SELF.'&singleout='.$i++.'" rel="external nofollow" >'.$server.'</a><br/>'
  679.       } 
  680.     } 
  681.     else
  682.       echo '1.'.$MEMCACHE_SERVERS[0]; 
  683.     } 
  684.     if (isset($_GET['singleout'])){ 
  685.        echo '<a href="'.$PHP_SELF.'" rel="external nofollow" >(all servers)</a><br/>'
  686.     } 
  687.     echo "</td></tr> "
  688.     echo "<tr class=tr-1><td class=td-0>Total Memcache Cache</td><td>".bsize($memcacheStats['limit_maxbytes'])."</td></tr> "
  689.  
  690.   echo <<<EOB 
  691.     </tbody></table> 
  692.     </div> 
  693.  
  694.     <div class="info div1"><h2>Memcache Server Information</h2> 
  695. EOB; 
  696.     foreach($MEMCACHE_SERVERS as $server){ 
  697.       echo '<table cellspacing=0><tbody>'
  698.       echo '<tr class=tr-1><td class=td-1>'.$server.'</td><td><a href="'.$PHP_SELF.'&server='.array_search($server,$MEMCACHE_SERVERS).'&op=6" rel="external nofollow" >[<b>Flush this server</b>]</a></td></tr>'
  699.       echo '<tr class=tr-0><td class=td-0>Start Time</td><td>',date(DATE_FORMAT,$memcacheStatsSingle[$server]['STAT']['time']-$memcacheStatsSingle[$server]['STAT']['uptime']),'</td></tr>'
  700.       echo '<tr class=tr-1><td class=td-0>Uptime</td><td>',duration($memcacheStatsSingle[$server]['STAT']['time']-$memcacheStatsSingle[$server]['STAT']['uptime']),'</td></tr>'
  701.       echo '<tr class=tr-0><td class=td-0>Memcached Server Version</td><td>'.$memcacheStatsSingle[$server]['STAT']['version'].'</td></tr>'
  702.       echo '<tr class=tr-1><td class=td-0>Used Cache Size</td><td>',bsize($memcacheStatsSingle[$server]['STAT']['bytes']),'</td></tr>'
  703.       echo '<tr class=tr-0><td class=td-0>Total Cache Size</td><td>',bsize($memcacheStatsSingle[$server]['STAT']['limit_maxbytes']),'</td></tr>'
  704.       echo '</tbody></table>'
  705.     } 
  706.   echo <<<EOB 
  707.  
  708.     </div> 
  709.     <div class="graph div3"><h2>Host Status Diagrams</h2> 
  710.     <table cellspacing=0><tbody> 
  711. EOB; 
  712.  
  713.   $size='width='.(GRAPH_SIZE+50).' height='.(GRAPH_SIZE+10); 
  714.   echo <<<EOB 
  715.     <tr> 
  716.     <td class=td-0>Cache Usage</td> 
  717.     <td class=td-1>Hits &amp; Misses</td> 
  718.     </tr> 
  719. EOB; 
  720.  
  721.   echo 
  722.     graphics_avail() ? 
  723.        '<tr>'
  724.        "<td class=td-0><img alt="" $size src="$PHP_SELF&IMG=1&".(isset($_GET['singleout'])? 'singleout='.$_GET['singleout'].'&':'')."$time"></td>"
  725.        "<td class=td-1><img alt="" $size src="$PHP_SELF&IMG=2&".(isset($_GET['singleout'])? 'singleout='.$_GET['singleout'].'&':'')."$time"></td></tr> " 
  726.       : ""
  727.     '<tr>'
  728.     '<td class=td-0><span class="green box">&nbsp;</span>Free: ',bsize($mem_avail).sprintf(" (%.1f%%)",$mem_avail*100/$mem_size),"</td> "
  729.     '<td class=td-1><span class="green box">&nbsp;</span>Hits: ',$hits.sprintf(" (%.1f%%)",$hits*100/($hits+$misses)),"</td> "
  730.     '</tr>'
  731.     '<tr>'
  732.     '<td class=td-0><span class="red box">&nbsp;</span>Used: ',bsize($mem_used ).sprintf(" (%.1f%%)",$mem_used *100/$mem_size),"</td> "
  733.     '<td class=td-1><span class="red box">&nbsp;</span>Misses: ',$misses.sprintf(" (%.1f%%)",$misses*100/($hits+$misses)),"</td> "
  734.     echo <<< EOB 
  735.   </tr> 
  736.   </tbody></table> 
  737. <br/> 
  738.   <div class="info"><h2>Cache Information</h2> 
  739.     <table cellspacing=0><tbody> 
  740.     <tr class=tr-0><td class=td-0>Current Items(total)</td><td>$curr_items ($total_items)</td></tr> 
  741.     <tr class=tr-1><td class=td-0>Hits</td><td>{$hits}</td></tr> 
  742.     <tr class=tr-0><td class=td-0>Misses</td><td>{$misses}</td></tr> 
  743.     <tr class=tr-1><td class=td-0>Request Rate (hits, misses)</td><td>$req_rate cache requests/second</td></tr> 
  744.     <tr class=tr-0><td class=td-0>Hit Rate</td><td>$hit_rate cache requests/second</td></tr> 
  745.     <tr class=tr-1><td class=td-0>Miss Rate</td><td>$miss_rate cache requests/second</td></tr> 
  746.     <tr class=tr-0><td class=td-0>Set Rate</td><td>$set_rate cache requests/second</td></tr> 
  747.     </tbody></table> 
  748.     </div> 
  749.  
  750. EOB; 
  751.  
  752.   break
  753.  
  754.   case 2: // variables 
  755.  
  756.     $m=0; 
  757.     $cacheItems= getCacheItems(); 
  758.     $items = $cacheItems['items']; 
  759.     $totals = $cacheItems['counts']; 
  760.     $maxDump = MAX_ITEM_DUMP; 
  761.     foreach($items as $server => $entries) { 
  762.  
  763.     echo <<< EOB 
  764.  
  765.       <div class="info"><table cellspacing=0><tbody> 
  766.       <tr><th colspan="2">$server</th></tr> 
  767.       <tr><th>Slab Id</th><th>Info</th></tr> 
  768. EOB; 
  769.  
  770.       foreach($entries as $slabId => $slab) { 
  771.         $dumpUrl = $PHP_SELF.'&op=2&server='.(array_search($server,$MEMCACHE_SERVERS)).'&dumpslab='.$slabId; 
  772.         echo 
  773.           "<tr class=tr-$m>"
  774.           "<td class=td-0><center>",'<a href="',$dumpUrl,'" rel="external nofollow" >',$slabId,'</a>',"</center></td>"
  775.           "<td class=td-last><b>Item count:</b> ",$slab['number'],'<br/><b>Age:</b>',duration($time-$slab['age']),'<br/> <b>Evicted:</b>',((isset($slab['evicted']) && $slab['evicted']==1)? 'Yes':'No'); 
  776.           if ((isset($_GET['dumpslab']) && $_GET['dumpslab']==$slabId) && (isset($_GET['server']) && $_GET['server']==array_search($server,$MEMCACHE_SERVERS))){ 
  777.             echo "<br/><b>Items: item</b><br/>"
  778.             $items = dumpCacheSlab($server,$slabId,$slab['number']); 
  779.             // maybe someone likes to do a pagination here :) 
  780.             $i=1; 
  781.             foreach($items['ITEM'] as $itemKey=>$itemInfo){ 
  782.               $itemInfo = trim($itemInfo,'[ ]'); 
  783.  
  784.               echo '<a href="',$PHP_SELF,'&op=4&server=',(array_search($server,$MEMCACHE_SERVERS)),'&key=',base64_encode($itemKey).'" rel="external nofollow" >',$itemKey,'</a>'
  785.               if ($i++ % 10 == 0) { 
  786.                 echo '<br/>'
  787.               } 
  788.               elseif ($i!=$slab['number']+1){ 
  789.                 echo ','
  790.               } 
  791.             } 
  792.           } 
  793.  
  794.           echo "</td></tr>"
  795.         $m=1-$m; 
  796.       } 
  797.     echo <<<EOB 
  798.       </tbody></table> 
  799.       </div><hr/> 
  800. EOB; 
  801.     break
  802.  
  803.   break
  804.  
  805.   case 4: //item dump 
  806.     if (!isset($_GET['key']) || !isset($_GET['server'])){ 
  807.       echo "No key set!"
  808.       break
  809.     } 
  810.     // I'm not doing anything to check the validity of the key string. 
  811.     // probably an exploit can be written to delete all the files in key=base64_encode(" delete all"). 
  812.     // somebody has to do a fix to this. 
  813.     $theKey = htmlentities(base64_decode($_GET['key'])); 
  814.  
  815.     $theserver = $MEMCACHE_SERVERS[(int)$_GET['server']]; 
  816.     list($h,$p) = explode(':',$theserver); 
  817.     $r = sendMemcacheCommand($h,$p,'get '.$theKey); 
  818.     echo <<<EOB 
  819.     <div class="info"><table cellspacing=0><tbody> 
  820.       <tr><th>Server<th>Key</th><th>Value</th><th>Delete</th></tr> 
  821. EOB; 
  822.     echo "<tr><td class=td-0>",$theserver,"</td><td class=td-0>",$theKey, 
  823.        " <br/>flag:",$r['VALUE'][$theKey]['stat']['flag'], 
  824.        " <br/>Size:",bsize($r['VALUE'][$theKey]['stat']['size']), 
  825.        "</td><td>",chunk_split($r['VALUE'][$theKey]['value'],40),"</td>"
  826.        '<td><a href="',$PHP_SELF,'&op=5&server=',(int)$_GET['server'],'&key=',base64_encode($theKey)," rel="external nofollow" ">Delete</a></td>","</tr>"
  827.     echo <<<EOB 
  828.       </tbody></table> 
  829.       </div><hr/> 
  830. EOB; 
  831.   break
  832.   case 5: // item delete 
  833.     if (!isset($_GET['key']) || !isset($_GET['server'])){ 
  834.       echo "No key set!"
  835.       break
  836.     } 
  837.     $theKey = htmlentities(base64_decode($_GET['key'])); 
  838.     $theserver = $MEMCACHE_SERVERS[(int)$_GET['server']]; 
  839.     list($h,$p) = explode(':',$theserver); 
  840.     $r = sendMemcacheCommand($h,$p,'delete '.$theKey); 
  841.     echo 'Deleting '.$theKey.':'.$r; 
  842.   break
  843.  
  844.   case 6: // flush server 
  845.     $theserver = $MEMCACHE_SERVERS[(int)$_GET['server']]; 
  846.     $r = flushServer($theserver); 
  847.     echo 'Flush '.$theserver.":".$r; 
  848.   break
  849. echo getFooter(); 
  850.  
  851. ?> 
 

到此这篇关于基于Nginx的Mencached缓存配置详解的文章就介绍到这了,更多相关Nginx Mencached缓存配置内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.51cto.com/14832653/2506978