ServerInfo.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. <?php
  2. /**
  3. * Author: lf
  4. * Blog: https://blog.feehi.com
  5. * Email: job@feehi.com
  6. * Created at: 2016-10-16 17:15
  7. */
  8. namespace common\libs;
  9. class ServerInfo
  10. {
  11. /**
  12. * 获取服务器实时信息,支持不同操作系统
  13. *
  14. */
  15. public function getinfo()
  16. {
  17. error_reporting(0); //会有多处报错,因此这里进行屏蔽
  18. switch (PHP_OS) {// 根据不同系统取得CPU相关信息
  19. case "Linux":
  20. $sysInfo = self::sys_linux();
  21. break;
  22. case "FreeBSD":
  23. $sysInfo = self::sys_freebsd();
  24. break;
  25. default:
  26. $sysInfo = [];
  27. break;
  28. }
  29. $result = $sysInfo;
  30. $result['freeSpace'] = round(@disk_free_space(".") / (1024 * 1024 * 1024), 3);
  31. $result['diskTotal'] = round(@disk_total_space(".") / (1024 * 1024 * 1024), 3); //总空间
  32. //网卡流量
  33. $strs = @file("/proc/net/dev");
  34. $NetOut = array();
  35. for ($i = 2; $i < count($strs); $i++) {
  36. preg_match_all("/([^\s]+):[\s]{0,}(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/", $strs[$i], $info);
  37. /* $NetInput[$i] = formatsize($info[2][0]);
  38. $NetOut[$i] = formatsize($info[10][0]);
  39. */
  40. $tmo = round($info[2][0] / 1024 / 1024, 5);
  41. $tmo2 = round($tmo / 1024, 5);
  42. $NetInput[$i] = $tmo2;
  43. $tmp = round($info[10][0] / 1024 / 1024, 5);
  44. $tmp2 = round($tmp / 1024, 5);
  45. $NetOut[$i] = $tmp2;
  46. }
  47. //判断内存如果小于1GB,就显示M,否则显示GB单位
  48. if ($sysInfo['memTotal'] < 1024) {
  49. $result['TotalMemory'] = $sysInfo['memTotal'] . " MB";
  50. $result['UsedMemory'] = $sysInfo['memUsed'] . " MB";
  51. $result['FreeMemory'] = $sysInfo['memFree'] . " MB";
  52. $result['CachedMemory'] = $sysInfo['memCached'] . " MB"; //cache化内存
  53. $result['Buffers'] = $sysInfo['memBuffers'] . " MB"; //缓冲
  54. $result['TotalSwap'] = $sysInfo['swapTotal'] . " MB";
  55. $result['swapUsed'] = $sysInfo['swapUsed'] . " MB";
  56. $result['swapFree'] = $sysInfo['swapFree'] . " MB";
  57. $result['swapPercent'] = $sysInfo['swapPercent'];
  58. $result['memRealUsed'] = $sysInfo['memRealUsed'] . " MB"; //真实内存使用
  59. $result['memRealFree'] = $sysInfo['memRealFree'] . " MB"; //真实内存空闲
  60. $result['memRealPercent'] = $sysInfo['memRealPercent']; //真实内存使用比率
  61. $result['memPercent'] = $sysInfo['memPercent'] . '%'; //内存总使用率
  62. $result['memCachedPercent'] = $sysInfo['memCachedPercent']; //cache内存使用率
  63. } else {
  64. $result['TotalMemory'] = round($sysInfo['memTotal'] / 1024, 3) . " GB";
  65. $result['UsedMemory'] = round($sysInfo['memUsed'] / 1024, 3) . " GB";
  66. $result['FreeMemory'] = round($sysInfo['memFree'] / 1024, 3) . " GB";
  67. $result['CachedMemory'] = round($sysInfo['memCached'] / 1024, 3) . " GB";
  68. $result['Buffers'] = round($sysInfo['memBuffers'] / 1024, 3) . " GB";
  69. $result['TotalSwap'] = round($sysInfo['swapTotal'] / 1024, 3) . " GB";
  70. $result['swapUsed'] = round($sysInfo['swapUsed'] / 1024, 3) . " GB";
  71. $result['swapFree'] = round($sysInfo['swapFree'] / 1024, 3) . " GB";
  72. $result['swapPercent'] = $sysInfo['swapPercent'];
  73. $result['memRealUsed'] = round($sysInfo['memRealUsed'] / 1024, 3) . " GB"; //真实内存使用
  74. $result['memRealFree'] = round($sysInfo['memRealFree'] / 1024, 3) . " GB"; //真实内存空闲
  75. $result['memRealPercent'] = $sysInfo['memRealPercent']; //真实内存使用比率
  76. $result['memPercent'] = $sysInfo['memPercent'] . '%'; //内存总使用率
  77. $result['memCachedPercent'] = $sysInfo['memCachedPercent']; //cache内存使用率
  78. }
  79. $result['barmemCachedPercent'] = $result['memCachedPercent'] . '%';
  80. $result['barswapPercent'] = $result['swapPercent'] . '%';
  81. $result['barmemRealPercent'] = $result['memRealPercent'] . '%';
  82. $result['NetOut2'] = $NetOut[2];
  83. $result['NetOut3'] = $NetOut[3];
  84. $result['NetOut4'] = $NetOut[4];
  85. $result['NetOut5'] = $NetOut[5];
  86. $result['NetOut6'] = $NetOut[6];
  87. $result['NetOut7'] = $NetOut[7];
  88. $result['NetOut8'] = $NetOut[8];
  89. $result['NetOut9'] = $NetOut[9];
  90. $result['NetOut10'] = $NetOut[10];
  91. $result['NetInput2'] = $NetInput[2];
  92. $result['NetInput3'] = $NetInput[3];
  93. $result['NetInput4'] = $NetInput[4];
  94. $result['NetInput5'] = $NetInput[5];
  95. $result['NetInput6'] = $NetInput[6];
  96. $result['NetInput7'] = $NetInput[7];
  97. $result['NetInput8'] = $NetInput[8];
  98. $result['NetInput9'] = $NetInput[9];
  99. $result['NetInput10'] = $NetInput[10];
  100. return $result;
  101. }
  102. //linux系统探测
  103. public function sys_linux()
  104. {
  105. // CPU
  106. if (false === ($str = @file("/proc/cpuinfo"))) {
  107. return false;
  108. }
  109. $str = implode("", $str);
  110. @preg_match_all("/model\s+name\s{0,}\:+\s{0,}([\w\s\)\(\@.-]+)([\r\n]+)/s", $str, $model);
  111. @preg_match_all("/cpu\s+MHz\s{0,}\:+\s{0,}([\d\.]+)[\r\n]+/", $str, $mhz);
  112. @preg_match_all("/cache\s+size\s{0,}\:+\s{0,}([\d\.]+\s{0,}[A-Z]+[\r\n]+)/", $str, $cache);
  113. @preg_match_all("/bogomips\s{0,}\:+\s{0,}([\d\.]+)[\r\n]+/", $str, $bogomips);
  114. if (false !== is_array($model[1])) {
  115. $res['cpu']['num'] = sizeof($model[1]);
  116. /*
  117. for($i = 0; $i < $res['cpu']['num']; $i++){
  118. $res['cpu']['model'][] = $model[1][$i].'&nbsp;('.$mhz[1][$i].')';
  119. $res['cpu']['mhz'][] = $mhz[1][$i];
  120. $res['cpu']['cache'][] = $cache[1][$i];
  121. $res['cpu']['bogomips'][] = $bogomips[1][$i];
  122. }*/
  123. if ($res['cpu']['num'] == 1) {
  124. $x1 = '';
  125. } else {
  126. $x1 = ' ×' . $res['cpu']['num'];
  127. }
  128. $mhz[1][0] = ' | 频率:' . $mhz[1][0];
  129. $cache[1][0] = ' | 二级缓存:' . $cache[1][0];
  130. $bogomips[1][0] = ' | Bogomips:' . $bogomips[1][0];
  131. $res['cpu']['model'][] = $model[1][0] . $mhz[1][0] . $cache[1][0] . $bogomips[1][0] . $x1;
  132. if (false !== is_array($res['cpu']['model'])) {
  133. $res['cpu']['model'] = implode("<br />", $res['cpu']['model']);
  134. }
  135. if (false !== is_array($res['cpu']['mhz'])) {
  136. $res['cpu']['mhz'] = implode("<br />", $res['cpu']['mhz']);
  137. }
  138. if (false !== is_array($res['cpu']['cache'])) {
  139. $res['cpu']['cache'] = implode("<br />", $res['cpu']['cache']);
  140. }
  141. if (false !== is_array($res['cpu']['bogomips'])) {
  142. $res['cpu']['bogomips'] = implode("<br />", $res['cpu']['bogomips']);
  143. }
  144. }
  145. // NETWORK
  146. // UPTIME
  147. if (false === ($str = @file("/proc/uptime"))) {
  148. return false;
  149. }
  150. $str = explode(" ", implode("", $str));
  151. $str = trim($str[0]);
  152. $min = $str / 60;
  153. $hours = $min / 60;
  154. $days = floor($hours / 24);
  155. $hours = floor($hours - ($days * 24));
  156. $min = floor($min - ($days * 60 * 24) - ($hours * 60));
  157. if ($days !== 0) {
  158. $res['uptime'] = $days . "天";
  159. }
  160. if ($hours !== 0) {
  161. $res['uptime'] .= $hours . "小时";
  162. }
  163. $res['uptime'] .= $min . "分钟";
  164. // MEMORY
  165. if (false === ($str = @file("/proc/meminfo"))) {
  166. return false;
  167. }
  168. $str = implode("", $str);
  169. preg_match_all("/MemTotal\s{0,}\:+\s{0,}([\d\.]+).+?MemFree\s{0,}\:+\s{0,}([\d\.]+).+?Cached\s{0,}\:+\s{0,}([\d\.]+).+?SwapTotal\s{0,}\:+\s{0,}([\d\.]+).+?SwapFree\s{0,}\:+\s{0,}([\d\.]+)/s", $str, $buf);
  170. preg_match_all("/Buffers\s{0,}\:+\s{0,}([\d\.]+)/s", $str, $buffers);
  171. $res['memTotal'] = round($buf[1][0] / 1024, 2);
  172. $res['memFree'] = round($buf[2][0] / 1024, 2);
  173. $res['memBuffers'] = round($buffers[1][0] / 1024, 2);
  174. $res['memCached'] = round($buf[3][0] / 1024, 2);
  175. $res['memUsed'] = $res['memTotal'] - $res['memFree'];
  176. $res['memPercent'] = (floatval($res['memTotal']) != 0) ? round($res['memUsed'] / $res['memTotal'] * 100, 2) : 0;
  177. $res['memRealUsed'] = $res['memTotal'] - $res['memFree'] - $res['memCached'] - $res['memBuffers']; //真实内存使用
  178. $res['memRealFree'] = $res['memTotal'] - $res['memRealUsed']; //真实空闲
  179. $res['memRealPercent'] = (floatval($res['memTotal']) != 0) ? round($res['memRealUsed'] / $res['memTotal'] * 100, 2) : 0; //真实内存使用率
  180. $res['memCachedPercent'] = (floatval($res['memCached']) != 0) ? round($res['memCached'] / $res['memTotal'] * 100, 2) : 0; //Cached内存使用率
  181. $res['swapTotal'] = round($buf[4][0] / 1024, 2);
  182. $res['swapFree'] = round($buf[5][0] / 1024, 2);
  183. $res['swapUsed'] = round($res['swapTotal'] - $res['swapFree'], 2);
  184. $res['swapPercent'] = (floatval($res['swapTotal']) != 0) ? round($res['swapUsed'] / $res['swapTotal'] * 100, 2) : 0;
  185. // LOAD AVG
  186. if (false === ($str = @file("/proc/loadavg"))) {
  187. return false;
  188. }
  189. $str = explode(" ", implode("", $str));
  190. $str = array_chunk($str, 4);
  191. $res['loadAvg'] = implode(" ", $str[0]);
  192. return $res;
  193. }
  194. //FreeBSD系统探测
  195. public function sys_freebsd()
  196. {
  197. //CPU
  198. if (false === ($res['cpu']['num'] = self::get_key("hw.ncpu"))) {
  199. return false;
  200. }
  201. $res['cpu']['model'] = self::get_key("hw.model");
  202. //LOAD AVG
  203. if (false === ($res['loadAvg'] = self::get_key("vm.loadavg"))) {
  204. return false;
  205. }
  206. //UPTIME
  207. if (false === ($buf = self::get_key("kern.boottime"))) {
  208. return false;
  209. }
  210. $buf = explode(' ', $buf);
  211. $sys_ticks = time() - intval($buf[3]);
  212. $min = $sys_ticks / 60;
  213. $hours = $min / 60;
  214. $days = floor($hours / 24);
  215. $hours = floor($hours - ($days * 24));
  216. $min = floor($min - ($days * 60 * 24) - ($hours * 60));
  217. if ($days !== 0) {
  218. $res['uptime'] = $days . "天";
  219. }
  220. if ($hours !== 0) {
  221. $res['uptime'] .= $hours . "小时";
  222. }
  223. $res['uptime'] .= $min . "分钟";
  224. //MEMORY
  225. if (false === ($buf = self::get_key("hw.physmem"))) {
  226. return false;
  227. }
  228. $res['memTotal'] = round($buf / 1024 / 1024, 2);
  229. $str = self::get_key("vm.vmtotal");
  230. preg_match_all("/\nVirtual Memory[\:\s]*\(Total[\:\s]*([\d]+)K[\,\s]*Active[\:\s]*([\d]+)K\)\n/i", $str, $buff, PREG_SET_ORDER);
  231. preg_match_all("/\nReal Memory[\:\s]*\(Total[\:\s]*([\d]+)K[\,\s]*Active[\:\s]*([\d]+)K\)\n/i", $str, $buf, PREG_SET_ORDER);
  232. $res['memRealUsed'] = round($buf[0][2] / 1024, 2);
  233. $res['memCached'] = round($buff[0][2] / 1024, 2);
  234. $res['memUsed'] = round($buf[0][1] / 1024, 2) + $res['memCached'];
  235. $res['memFree'] = $res['memTotal'] - $res['memUsed'];
  236. $res['memPercent'] = (floatval($res['memTotal']) != 0) ? round($res['memUsed'] / $res['memTotal'] * 100, 2) : 0;
  237. $res['memRealPercent'] = (floatval($res['memTotal']) != 0) ? round($res['memRealUsed'] / $res['memTotal'] * 100, 2) : 0;
  238. return $res;
  239. }
  240. //取得参数值 FreeBSD
  241. private function get_key($keyName)
  242. {
  243. return self::do_command('sysctl', "-n $keyName");
  244. }
  245. //确定执行文件位置 FreeBSD
  246. private function find_command($commandName)
  247. {
  248. $path = array('/bin', '/sbin', '/usr/bin', '/usr/sbin', '/usr/local/bin', '/usr/local/sbin');
  249. foreach ($path as $p) {
  250. if (@is_executable("$p/$commandName")) {
  251. return "$p/$commandName";
  252. }
  253. }
  254. return false;
  255. }
  256. //执行系统命令 FreeBSD
  257. private function do_command($commandName, $args)
  258. {
  259. $buffer = "";
  260. if (false === ($command = self::find_command($commandName))) {
  261. return false;
  262. }
  263. if ($fp = @popen("$command $args", 'r')) {
  264. while (! @feof($fp)) {
  265. $buffer .= @fgets($fp, 4096);
  266. }
  267. return trim($buffer);
  268. }
  269. return false;
  270. }
  271. private function GetWMI($wmi, $strClass, $strValue = array())
  272. {
  273. $arrData = array();
  274. $objWEBM = $wmi->Get($strClass);
  275. $arrProp = $objWEBM->Properties_;
  276. $arrWEBMCol = $objWEBM->Instances_();
  277. foreach ($arrWEBMCol as $objItem) {
  278. @reset($arrProp);
  279. $arrInstance = array();
  280. foreach ($arrProp as $propItem) {
  281. eval("\$value = \$objItem->" . $propItem->Name . ";");
  282. if (empty($strValue)) {
  283. $arrInstance[$propItem->Name] = trim($value);
  284. } else {
  285. if (in_array($propItem->Name, $strValue)) {
  286. $arrInstance[$propItem->Name] = trim($value);
  287. }
  288. }
  289. }
  290. $arrData[] = $arrInstance;
  291. }
  292. return $arrData;
  293. }
  294. }