ServerController.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. <?php
  2. namespace App\Http\Controllers\Admin\Config;
  3. use Illuminate\Http\Request;
  4. use App\Http\Controllers\Controller;
  5. class ServerController extends Controller
  6. {
  7. public function index()
  8. {
  9. $this->server();
  10. }
  11. /**
  12. * 서버 상태
  13. * @method GET
  14. * @see /admin/config/server
  15. */
  16. public function server()
  17. {
  18. // 서버 자원 정보
  19. return view('admin.config.server.index', [
  20. 'subject' => '서버상태',
  21. 'networkInfo' => $this->getNetworkInfo(),
  22. 'memInfo' => $this->getMemoryInfo(),
  23. 'cpuInfo' => $this->getCpuInfo(),
  24. 'sysInfo' => $this->getSysInfo(),
  25. 'os' => explode(" ", php_uname()) // 서버 운영체제 정보
  26. ]);
  27. }
  28. /**
  29. * 관리자 페이지 메인 ajax 호출
  30. */
  31. public function ajaxData(Request $request)
  32. {
  33. if (!$request->ajax()) {
  34. exit('No direct script access allowed');
  35. }
  36. $sysInfo = $this->getSysInfo();
  37. echo json_encode([
  38. 'networkInfo' => $this->getNetworkInfo(),
  39. 'sysInfo' => $sysInfo,
  40. 'upTime' => $sysInfo['uptime'],
  41. 'sTime' => date('Y-m-d H:i:s'),
  42. 'cpuInfo' => $this->getCpuInfo(),
  43. 'memInfo' => $this->getMemoryInfo()
  44. ]);
  45. }
  46. /**
  47. * 운영체제 및 서버 시스템 정보
  48. */
  49. private function getSysInfo()
  50. {
  51. $sysInfo = [null];
  52. switch (PHP_OS) {
  53. case "Linux":
  54. // CPU
  55. if (false === ($str = @file("/proc/cpuinfo"))) {
  56. return false;
  57. }
  58. $str = implode("", $str);
  59. @preg_match_all("/model\s+name\s{0,}\:+\s{0,}([\w\s\)\(\@.-]+)([\r\n]+)/s", $str, $model);
  60. @preg_match_all("/cpu\s+MHz\s{0,}\:+\s{0,}([\d\.]+)[\r\n]+/", $str, $mhz);
  61. @preg_match_all("/cache\s+size\s{0,}\:+\s{0,}([\d\.]+\s{0,}[A-Z]+[\r\n]+)/", $str, $cache);
  62. @preg_match_all("/bogomips\s{0,}\:+\s{0,}([\d\.]+)[\r\n]+/", $str, $bogomips);
  63. if (false !== is_array($model[1])) {
  64. $sysInfo['cpu']['num'] = sizeof($model[1]);
  65. for ($i = 0; $i < $sysInfo['cpu']['num']; $i++) {
  66. $sysInfo['cpu']['model'][] = $model[1][$i] . '&nbsp;(' . $mhz[1][$i] . ')';
  67. $sysInfo['cpu']['mhz'][] = $mhz[1][$i];
  68. $sysInfo['cpu']['cache'][] = $cache[1][$i];
  69. $sysInfo['cpu']['bogomips'][] = $bogomips[1][$i];
  70. }
  71. if ($sysInfo['cpu']['num'] == 1) {
  72. $x1 = '';
  73. } else {
  74. $x1 = ' Г—' . $sysInfo['cpu']['num'];
  75. }
  76. $mhz[1][0] = ' | Frequency:' . $mhz[1][0];
  77. $cache[1][0] = ' | Secondary cache:' . $cache[1][0];
  78. $bogomips[1][0] = ' | Bogomips:' . $bogomips[1][0];
  79. $sysInfo['cpu']['model'][] = $model[1][0] . $mhz[1][0] . $cache[1][0] . $bogomips[1][0] . $x1;
  80. if (false !== is_array($sysInfo['cpu']['model'])) $sysInfo['cpu']['model'] = implode("<br />", $sysInfo['cpu']['model']);
  81. if (false !== is_array($sysInfo['cpu']['mhz'])) $sysInfo['cpu']['mhz'] = implode("<br />", $sysInfo['cpu']['mhz']);
  82. if (false !== is_array($sysInfo['cpu']['cache'])) $sysInfo['cpu']['cache'] = implode("<br />", $sysInfo['cpu']['cache']);
  83. if (false !== is_array($sysInfo['cpu']['bogomips'])) $sysInfo['cpu']['bogomips'] = implode("<br />", $sysInfo['cpu']['bogomips']);
  84. }
  85. // NETWORK, UPTIME
  86. if (false === ($str = @file("/proc/uptime"))) {
  87. return false;
  88. }
  89. $str = explode(" ", implode("", $str));
  90. $str = trim($str[0]);
  91. $min = $str / 60;
  92. $hours = $min / 60;
  93. $days = floor($hours / 24);
  94. $hours = floor($hours - ($days * 24));
  95. $min = floor($min - ($days * 60 * 24) - ($hours * 60));
  96. if ($days !== 0) $sysInfo['uptime'] = $days . " Day";
  97. if ($hours !== 0) $sysInfo['uptime'] .= $hours . " Hour";
  98. $sysInfo['uptime'] .= $min . " Minute";
  99. // MEMORY
  100. if (false === ($str = @file("/proc/meminfo"))) {
  101. return false;
  102. }
  103. $str = implode("", $str);
  104. 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);
  105. preg_match_all("/Buffers\s{0,}\:+\s{0,}([\d\.]+)/s", $str, $buffers);
  106. $sysInfo['memTotal'] = round($buf[1][0] / 1024, 2);
  107. $sysInfo['memFree'] = round($buf[2][0] / 1024, 2);
  108. $sysInfo['memBuffers'] = round($buffers[1][0] / 1024, 2);
  109. $sysInfo['memCached'] = round($buf[3][0] / 1024, 2);
  110. $sysInfo['memUsed'] = $sysInfo['memTotal'] - $sysInfo['memFree'];
  111. $sysInfo['memPercent'] = (floatval($sysInfo['memTotal']) != 0) ? round($sysInfo['memUsed'] / $sysInfo['memTotal'] * 100, 2) : 0;
  112. $sysInfo['memRealUsed'] = $sysInfo['memTotal'] - $sysInfo['memFree'] - $sysInfo['memCached'] - $sysInfo['memBuffers'];
  113. $sysInfo['memRealFree'] = $sysInfo['memTotal'] - $sysInfo['memRealUsed'];
  114. $sysInfo['memRealPercent'] = (floatval($sysInfo['memTotal']) != 0) ? round($sysInfo['memRealUsed'] / $sysInfo['memTotal'] * 100, 2) : 0;
  115. $sysInfo['memCachedPercent'] = (floatval($sysInfo['memCached']) != 0) ? round($sysInfo['memCached'] / $sysInfo['memTotal'] * 100, 2) : 0;
  116. $sysInfo['swapTotal'] = round($buf[4][0] / 1024, 2);
  117. $sysInfo['swapFree'] = round($buf[5][0] / 1024, 2);
  118. $sysInfo['swapUsed'] = round($sysInfo['swapTotal'] - $sysInfo['swapFree'], 2);
  119. $sysInfo['swapPercent'] = (floatval($sysInfo['swapTotal']) != 0) ? round($sysInfo['swapUsed'] / $sysInfo['swapTotal'] * 100, 2) : 0;
  120. // LOAD AVG
  121. if (false === ($str = @file("/proc/loadavg"))) {
  122. return false;
  123. }
  124. $str = explode(" ", implode("", $str));
  125. $str = array_chunk($str, 4);
  126. $sysInfo['loadAvg'] = implode(" ", $str[0]);
  127. break;
  128. case "FreeBSD":
  129. // CPU
  130. if (false === ($sysInfo['cpu']['num'] = getKey("hw.ncpu"))) {
  131. return false;
  132. }
  133. $sysInfo['cpu']['model'] = getKey("hw.model");
  134. // LOAD AVG
  135. if (false === ($sysInfo['loadAvg'] = getKey("vm.loadavg"))) {
  136. return false;
  137. }
  138. // UPTIME
  139. if (false === ($buf = getKey("kern.boottime"))) {
  140. return false;
  141. }
  142. $buf = explode(' ', $buf);
  143. $sys_ticks = time() - intval($buf[3]);
  144. $min = $sys_ticks / 60;
  145. $hours = $min / 60;
  146. $days = floor($hours / 24);
  147. $hours = floor($hours - ($days * 24));
  148. $min = floor($min - ($days * 60 * 24) - ($hours * 60));
  149. if ($days !== 0) $sysInfo['uptime'] = $days . " Day";
  150. if ($hours !== 0) $sysInfo['uptime'] .= $hours . " Hour";
  151. $sysInfo['uptime'] .= $min . " Minute";
  152. // MEMORY
  153. if (false === ($buf = getKey("hw.physmem"))) {
  154. return false;
  155. }
  156. $sysInfo['memTotal'] = round($buf / 1024 / 1024, 2);
  157. $str = getKey("vm.vmtotal");
  158. preg_match_all("/\nVirtual Memory[\:\s]*\(Total[\:\s]*([\d]+)K[\,\s]*Active[\:\s]*([\d]+)K\)\n/i", $str, $buff, PREG_SET_ORDER);
  159. preg_match_all("/\nReal Memory[\:\s]*\(Total[\:\s]*([\d]+)K[\,\s]*Active[\:\s]*([\d]+)K\)\n/i", $str, $buf, PREG_SET_ORDER);
  160. $sysInfo['memRealUsed'] = round($buf[0][2] / 1024, 2);
  161. $sysInfo['memCached'] = round($buff[0][2] / 1024, 2);
  162. $sysInfo['memUsed'] = round($buf[0][1] / 1024, 2) + $sysInfo['memCached'];
  163. $sysInfo['memFree'] = $sysInfo['memTotal'] - $sysInfo['memUsed'];
  164. $sysInfo['memPercent'] = (floatval($sysInfo['memTotal']) != 0) ? round($sysInfo['memUsed'] / $sysInfo['memTotal'] * 100, 2) : 0;
  165. $sysInfo['memRealPercent'] = (floatval($sysInfo['memTotal']) != 0) ? round($sysInfo['memRealUsed'] / $sysInfo['memTotal'] * 100, 2) : 0;
  166. break;
  167. default:
  168. break;
  169. }
  170. if(in_array(PHP_OS, ['Linux', 'FreeBSD'])) {
  171. if ($sysInfo['memTotal'] < 1024) {
  172. $memTotal = $sysInfo['memTotal'] . " M";
  173. $mt = $sysInfo['memTotal'] . " M";
  174. $mu = $sysInfo['memUsed'] . " M";
  175. $mf = $sysInfo['memFree'] . " M";
  176. $mc = $sysInfo['memCached'] . " M";
  177. $mb = $sysInfo['memBuffers'] . " M";
  178. $st = $sysInfo['swapTotal'] . " M";
  179. $su = $sysInfo['swapUsed'] . " M";
  180. $sf = $sysInfo['swapFree'] . " M";
  181. $swapPercent = ($sysInfo['swapPercent']);
  182. $memRealUsed = $sysInfo['memRealUsed'] . " M";
  183. $memRealFree = $sysInfo['memRealFree'] . " M";
  184. $memRealPercent = ($sysInfo['memRealPercent']);
  185. $memPercent = ($sysInfo['memPercent']);
  186. $memCachedPercent = ($sysInfo['memCachedPercent']);
  187. } else {
  188. $memTotal = round($sysInfo['memTotal'] / 1024, 3) . " G";
  189. $mt = round($sysInfo['memTotal'] / 1024, 3) . " G";
  190. $mu = round($sysInfo['memUsed'] / 1024, 3) . " G";
  191. $mf = round($sysInfo['memFree'] / 1024, 3) . " G";
  192. $mc = round($sysInfo['memCached'] / 1024, 3) . " G";
  193. $mb = round($sysInfo['memBuffers'] / 1024, 3) . " G";
  194. $st = round($sysInfo['swapTotal'] / 1024, 3) . " G";
  195. $su = round($sysInfo['swapUsed'] / 1024, 3) . " G";
  196. $sf = round($sysInfo['swapFree'] / 1024, 3) . " G";
  197. $swapPercent = ($sysInfo['swapPercent']);
  198. $memRealUsed = round($sysInfo['memRealUsed'] / 1024, 3) . " G";
  199. $memRealFree = round($sysInfo['memRealFree'] / 1024, 3) . " G";
  200. $memRealPercent = ($sysInfo['memRealPercent']);
  201. $memPercent = ($sysInfo['memPercent']);
  202. $memCachedPercent = ($sysInfo['memCachedPercent']);
  203. }
  204. $sysInfo = array_merge($sysInfo, [
  205. 'memTotal' => $memTotal,
  206. 'mt' => $mt,
  207. 'mu' => $mu,
  208. 'mf' => $mf,
  209. 'mc' => $mc,
  210. 'mb' => $mb,
  211. 'st' => $st,
  212. 'su' => $su,
  213. 'sf' => $sf,
  214. 'swapPercent' => $swapPercent,
  215. 'memRealUsed' => $memRealUsed,
  216. 'memRealFree' => $memRealFree,
  217. 'memRealPercent' => $memRealPercent,
  218. 'memPercent' => $memPercent,
  219. 'memCachedPercent' => $memCachedPercent
  220. ]);
  221. }
  222. return $sysInfo;
  223. }
  224. /**
  225. * CPU 상세정보
  226. */
  227. private function getCpuInfo(): string
  228. {
  229. $stat1 = GetCoreInformation();
  230. sleep(1);
  231. $stat2 = GetCoreInformation();
  232. $data = GetCpuPercentages($stat1, $stat2);
  233. $ret = '';
  234. if(isset($data['cpu0']['user'])) {
  235. $ret .= $data['cpu0']['user'] . "%us, ";
  236. }
  237. if(isset($data['cpu0']['sys'])) {
  238. $ret .= $data['cpu0']['sys'] . "%sy, ";
  239. }
  240. if(isset($data['cpu0']['nice'])) {
  241. $ret .= $data['cpu0']['nice'] . "%ni, ";
  242. }
  243. if(isset($data['cpu0']['idle'])) {
  244. $ret .= $data['cpu0']['idle'] . "%id, ";
  245. }
  246. if(isset($data['cpu0']['iowait'])) {
  247. $ret .= $data['cpu0']['iowait'] . "%wa, ";
  248. }
  249. if(isset($data['cpu0']['irq'])) {
  250. $ret .= $data['cpu0']['irq'] . "%irq, ";
  251. }
  252. if(isset($data['cpu0']['softirq'])) {
  253. $ret .= $data['cpu0']['softirq'] . "%softirq";
  254. }
  255. return $ret;
  256. }
  257. /**
  258. * 사용 메모리 정보
  259. */
  260. private function getMemoryInfo(): array
  261. {
  262. $dt = round(@disk_total_space(".") / (1024 * 1024 * 1024), 3);
  263. $df = round(@disk_free_space(".") / (1024 * 1024 * 1024), 3);
  264. $du = ($dt - $df); //е·Із”Ё
  265. $hdPercent = ((floatval($dt) != 0) ? round($du / $dt * 100, 2) : 0);
  266. return ['dt' => $dt, 'df' => $df, 'du' => $du, 'hdPercent' => $hdPercent];
  267. }
  268. /**
  269. * 네트워크 정보 조회
  270. */
  271. private function getNetworkInfo(): array
  272. {
  273. // 네트워크 정보 조회
  274. $networkResult = [];
  275. $networkData = @file("/proc/net/dev");
  276. if($networkData) {
  277. for ($i = 2; $i < count($networkData); $i++) {
  278. 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+)/", $networkData[$i], $info);
  279. $networkResult[$i - 2] = [
  280. 'networkName' => $info[1][0],
  281. 'NetOutSpeed' => $info[10][0],
  282. 'NetInputSpeed' => $info[2][0],
  283. 'NetInput' => byteFormat($info[2][0]),
  284. 'NetOut' => byteFormat($info[10][0]),
  285. ];
  286. }
  287. }
  288. return $networkResult;
  289. }
  290. /**
  291. * PHP 정보
  292. * @method GET
  293. * @see /admin/config/server/php
  294. */
  295. public function php()
  296. {
  297. ob_start();
  298. phpinfo();
  299. $phpinfo = ob_get_contents();
  300. ob_end_clean();
  301. $phpinfo = preg_replace('%^.*<body>(.*)</body>.*$%ms', '$1', $phpinfo);
  302. ob_clean();
  303. return view('admin.config.php.index', [
  304. 'subject' => 'PHP 정보',
  305. 'phpinfo' => $phpinfo
  306. ]);
  307. }
  308. /**
  309. * DB 정보
  310. * @method GET
  311. * @see /admin/config/server/db
  312. */
  313. public function db()
  314. {
  315. return view('admin.config.db.index', [
  316. 'subject' => 'DB 정보',
  317. 'database' => config('database'),
  318. 'drivers' => join(', ', \Illuminate\Support\Facades\DB::availableDrivers())
  319. ]);
  320. }
  321. }