redis-stat.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. <?php
  2. define('CONFIG_FILE', __DIR__ . '/config.php');
  3. include __DIR__ . '/functions.php';
  4. $cfg = [];
  5. load_config();
  6. function stat_redis($host, $port)
  7. {
  8. $stat = null;
  9. try {
  10. $redis = new Redis();
  11. $redis->connect($host, $port);
  12. $stat = $redis->info();
  13. $stat['server'] = "{$host}:{$port}";
  14. if($stat['process_id']) {
  15. $item = $redis->config('GET', 'maxmemory');
  16. $stat['maxmemory'] = $item['maxmemory'];
  17. $item = $redis->config('GET', 'databases');
  18. $stat['databases'] = $item['databases'] ? intval($item['databases']) : 16;
  19. }
  20. } catch (RedisException $e) {
  21. $stat = false;
  22. }
  23. return $stat;
  24. }
  25. function parse_db_stat($stat)
  26. {
  27. $ret = [];
  28. if (empty($stat)) {
  29. return $ret;
  30. }
  31. $arr = explode(',', $stat);
  32. foreach ($arr as $item) {
  33. list($k, $v) = explode('=', $item, 2);
  34. $ret[$k] = $v;
  35. }
  36. return $ret;
  37. }
  38. $redisStats = array();
  39. $redisStats['default'] = stat_redis($cfg['redis_host'], $cfg['redis_port']);
  40. ?>
  41. <!doctype html>
  42. <html>
  43. <head>
  44. <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  45. <title>缓存状态监控</title>
  46. <style type="text/css">
  47. body{
  48. font-size: 12px;
  49. }
  50. h1{
  51. width: 1600px;
  52. }
  53. table{
  54. border-collapse: collapse;
  55. }
  56. th, td{
  57. padding: 2px 6px;
  58. border: 1px solid #000000;
  59. }
  60. tbody tr:hover{
  61. background-color: #DDDDFF;
  62. }
  63. td{
  64. text-align: right;
  65. }
  66. td ul{
  67. list-style: none;
  68. margin: 0px;
  69. padding: 0px;
  70. }
  71. td li{
  72. margin: 0px;
  73. padding: 0px;
  74. }
  75. .left{
  76. text-align: left;
  77. }
  78. .right{
  79. text-align: right;
  80. }
  81. .red{
  82. color: #FF0000;
  83. }
  84. .blue{
  85. color: #0000FF;
  86. }
  87. .green{
  88. color: #009900;
  89. }
  90. .yellow{
  91. color: #999900;
  92. }
  93. </style>
  94. </head>
  95. <body>
  96. <h1>Redis</h1>
  97. <table>
  98. <thead>
  99. <tr>
  100. <th>名称</th>
  101. <th>地址</th>
  102. <th>进程ID</th>
  103. <th>版本号</th>
  104. <th>上线时长</th>
  105. <th>用户CPU时长</th>
  106. <th>OPS/QPS</th>
  107. <th>总空间</th>
  108. <th>已用空间</th>
  109. <th>过期数</th>
  110. <th>丢弃数</th>
  111. <th>当前客户端</th>
  112. <th>阻塞客户端</th>
  113. <th>总接收连接数</th>
  114. <th>总处理指令数</th>
  115. <th>拒绝连接数</th>
  116. <th>获取命中</th>
  117. <th>获取未命中</th>
  118. <th>DB0使用</th>
  119. <!--
  120. <th>最长输出列表</th>
  121. <th>最大输入缓冲</th>
  122. -->
  123. </tr>
  124. </thead>
  125. <tbody>
  126. <?php foreach($redisStats as $name => $stats) { if (!$stats) continue; ?>
  127. <tr>
  128. <td class="left blue"><?php echo $name; ?></td>
  129. <td class="left"><?php echo $stats['server']; ?></td>
  130. <td class="<?php echo $stats['process_id'] ? '' : 'red'; ?>"><?php echo $stats['process_id'] ? $stats['process_id'] : '未启动'; ?></td>
  131. <td class="left"><?php echo $stats['redis_version']; ?></td>
  132. <td><?php echo intval($stats['uptime_in_days']) ; ?>天</td>
  133. <td><?php echo floatval($stats['used_cpu_user']); ?>秒</td>
  134. <td><?php echo $stats['instantaneous_ops_per_sec']; ?></td>
  135. <td class="<?php echo $stats['process_id'] && !$stats['maxmemory'] ? 'red' : ''; ?>"><?php echo $stats['process_id'] && !$stats['maxmemory'] ? '无限' : sprintf("%.2f", intval($stats['maxmemory']) / 1048576) . 'M'; ?></td>
  136. <td class="<?php echo $stats['maxmemory'] && $stats['used_memory'] && floatval(intval($stats['used_memory']) / intval($stats['maxmemory'])) > 0.8 ? 'red' : ''; ?>"><?php echo sprintf("%.2f", intval($stats['used_memory']) / 1048576); ?>M</td>
  137. <td><?php echo intval($stats['expired_keys']); ?></td>
  138. <td class="<?php echo $stats['evicted_keys'] ? 'red' : ''; ?>"><?php echo intval($stats['evicted_keys']); ?></td>
  139. <td><?php echo intval($stats['connected_clients']); ?></td>
  140. <td class="<?php echo $stats['blocked_clients'] ? 'red' : ''; ?>"><?php echo intval($stats['blocked_clients']); ?></td>
  141. <td><?php echo intval($stats['total_connections_received']); ?></td>
  142. <td><?php echo intval($stats['total_commands_processed']); ?></td>
  143. <td class="<?php echo $stats['rejected_connections'] ? 'red' : ''; ?>"><?php echo intval($stats['rejected_connections']); ?></td>
  144. <td><?php echo intval($stats['keyspace_hits']); ?></td>
  145. <td><?php echo intval($stats['keyspace_misses']); ?></td>
  146. <td class="left"><?php echo $stats['db0'] ? $stats['db0'] : '未使用'; ?></td>
  147. <!--
  148. <td><?php /* echo intval($stats['client_longest_output_list']); */ ?></td>
  149. <td><?php /* echo intval($stats['client_biggest_input_buf']); */ ?></td>
  150. -->
  151. </tr>
  152. <?php } ?>
  153. </tbody>
  154. </table>
  155. <?php foreach($redisStats as $name => $stats) { ?>
  156. <h1>Redis - <?php echo $name; ?></h1>
  157. <table>
  158. <thead>
  159. <tr>
  160. <th>DB序号</th>
  161. <th>KEY数量</th>
  162. <th>过期数</th>
  163. <th>平均有效期</th>
  164. </tr>
  165. </thead>
  166. <tbody>
  167. <?php if($stats['databases']) { for($i=0; $i<$stats['databases']; $i++) { $dbStat = isset($stats["db{$i}"]) ? parse_db_stat($stats["db{$i}"]) : []; ?>
  168. <tr>
  169. <td><?php echo $i; ?></td>
  170. <?php if (empty($dbStat)) { ?>
  171. <td>-</td>
  172. <td>-</td>
  173. <td>-</td>
  174. <?php } else { ?>
  175. <td><?php echo $dbStat['keys']; ?></td>
  176. <td><?php echo $dbStat['expires']; ?></td>
  177. <td><?php echo $dbStat['avg_ttl']; ?></td>
  178. <?php } ?>
  179. </tr>
  180. <?php } } ?>
  181. </tbody>
  182. </table>
  183. <?php } ?>
  184. </body>
  185. </html>