server(); } /** * 서버 상태 * @method GET * @see /admin/config/server */ public function server() { // 서버 자원 정보 return view('admin.config.server.index', [ 'subject' => '서버상태', 'networkInfo' => $this->getNetworkInfo(), 'memInfo' => $this->getMemoryInfo(), 'cpuInfo' => $this->getCpuInfo(), 'sysInfo' => $this->getSysInfo(), 'os' => explode(" ", php_uname()) // 서버 운영체제 정보 ]); } /** * 관리자 페이지 메인 ajax 호출 */ public function ajaxData(Request $request) { if (!$request->ajax()) { exit('No direct script access allowed'); } $sysInfo = $this->getSysInfo(); echo json_encode([ 'networkInfo' => $this->getNetworkInfo(), 'sysInfo' => $sysInfo, 'upTime' => $sysInfo['uptime'], 'sTime' => date('Y-m-d H:i:s'), 'cpuInfo' => $this->getCpuInfo(), 'memInfo' => $this->getMemoryInfo() ]); } /** * 운영체제 및 서버 시스템 정보 */ private function getSysInfo() { $sysInfo = [null]; switch (PHP_OS) { case "Linux": // CPU if (false === ($str = @file("/proc/cpuinfo"))) { return false; } $str = implode("", $str); @preg_match_all("/model\s+name\s{0,}\:+\s{0,}([\w\s\)\(\@.-]+)([\r\n]+)/s", $str, $model); @preg_match_all("/cpu\s+MHz\s{0,}\:+\s{0,}([\d\.]+)[\r\n]+/", $str, $mhz); @preg_match_all("/cache\s+size\s{0,}\:+\s{0,}([\d\.]+\s{0,}[A-Z]+[\r\n]+)/", $str, $cache); @preg_match_all("/bogomips\s{0,}\:+\s{0,}([\d\.]+)[\r\n]+/", $str, $bogomips); if (false !== is_array($model[1])) { $sysInfo['cpu']['num'] = sizeof($model[1]); for ($i = 0; $i < $sysInfo['cpu']['num']; $i++) { $sysInfo['cpu']['model'][] = $model[1][$i] . ' (' . $mhz[1][$i] . ')'; $sysInfo['cpu']['mhz'][] = $mhz[1][$i]; $sysInfo['cpu']['cache'][] = $cache[1][$i]; $sysInfo['cpu']['bogomips'][] = $bogomips[1][$i]; } if ($sysInfo['cpu']['num'] == 1) { $x1 = ''; } else { $x1 = ' Г—' . $sysInfo['cpu']['num']; } $mhz[1][0] = ' | Frequency:' . $mhz[1][0]; $cache[1][0] = ' | Secondary cache:' . $cache[1][0]; $bogomips[1][0] = ' | Bogomips:' . $bogomips[1][0]; $sysInfo['cpu']['model'][] = $model[1][0] . $mhz[1][0] . $cache[1][0] . $bogomips[1][0] . $x1; if (false !== is_array($sysInfo['cpu']['model'])) $sysInfo['cpu']['model'] = implode("
", $sysInfo['cpu']['model']); if (false !== is_array($sysInfo['cpu']['mhz'])) $sysInfo['cpu']['mhz'] = implode("
", $sysInfo['cpu']['mhz']); if (false !== is_array($sysInfo['cpu']['cache'])) $sysInfo['cpu']['cache'] = implode("
", $sysInfo['cpu']['cache']); if (false !== is_array($sysInfo['cpu']['bogomips'])) $sysInfo['cpu']['bogomips'] = implode("
", $sysInfo['cpu']['bogomips']); } // NETWORK, UPTIME if (false === ($str = @file("/proc/uptime"))) { return false; } $str = explode(" ", implode("", $str)); $str = trim($str[0]); $min = $str / 60; $hours = $min / 60; $days = floor($hours / 24); $hours = floor($hours - ($days * 24)); $min = floor($min - ($days * 60 * 24) - ($hours * 60)); if ($days !== 0) $sysInfo['uptime'] = $days . " Day"; if ($hours !== 0) $sysInfo['uptime'] .= $hours . " Hour"; $sysInfo['uptime'] .= $min . " Minute"; // MEMORY if (false === ($str = @file("/proc/meminfo"))) { return false; } $str = implode("", $str); 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); preg_match_all("/Buffers\s{0,}\:+\s{0,}([\d\.]+)/s", $str, $buffers); $sysInfo['memTotal'] = round($buf[1][0] / 1024, 2); $sysInfo['memFree'] = round($buf[2][0] / 1024, 2); $sysInfo['memBuffers'] = round($buffers[1][0] / 1024, 2); $sysInfo['memCached'] = round($buf[3][0] / 1024, 2); $sysInfo['memUsed'] = $sysInfo['memTotal'] - $sysInfo['memFree']; $sysInfo['memPercent'] = (floatval($sysInfo['memTotal']) != 0) ? round($sysInfo['memUsed'] / $sysInfo['memTotal'] * 100, 2) : 0; $sysInfo['memRealUsed'] = $sysInfo['memTotal'] - $sysInfo['memFree'] - $sysInfo['memCached'] - $sysInfo['memBuffers']; $sysInfo['memRealFree'] = $sysInfo['memTotal'] - $sysInfo['memRealUsed']; $sysInfo['memRealPercent'] = (floatval($sysInfo['memTotal']) != 0) ? round($sysInfo['memRealUsed'] / $sysInfo['memTotal'] * 100, 2) : 0; $sysInfo['memCachedPercent'] = (floatval($sysInfo['memCached']) != 0) ? round($sysInfo['memCached'] / $sysInfo['memTotal'] * 100, 2) : 0; $sysInfo['swapTotal'] = round($buf[4][0] / 1024, 2); $sysInfo['swapFree'] = round($buf[5][0] / 1024, 2); $sysInfo['swapUsed'] = round($sysInfo['swapTotal'] - $sysInfo['swapFree'], 2); $sysInfo['swapPercent'] = (floatval($sysInfo['swapTotal']) != 0) ? round($sysInfo['swapUsed'] / $sysInfo['swapTotal'] * 100, 2) : 0; // LOAD AVG if (false === ($str = @file("/proc/loadavg"))) { return false; } $str = explode(" ", implode("", $str)); $str = array_chunk($str, 4); $sysInfo['loadAvg'] = implode(" ", $str[0]); break; case "FreeBSD": // CPU if (false === ($sysInfo['cpu']['num'] = getKey("hw.ncpu"))) { return false; } $sysInfo['cpu']['model'] = getKey("hw.model"); // LOAD AVG if (false === ($sysInfo['loadAvg'] = getKey("vm.loadavg"))) { return false; } // UPTIME if (false === ($buf = getKey("kern.boottime"))) { return false; } $buf = explode(' ', $buf); $sys_ticks = time() - intval($buf[3]); $min = $sys_ticks / 60; $hours = $min / 60; $days = floor($hours / 24); $hours = floor($hours - ($days * 24)); $min = floor($min - ($days * 60 * 24) - ($hours * 60)); if ($days !== 0) $sysInfo['uptime'] = $days . " Day"; if ($hours !== 0) $sysInfo['uptime'] .= $hours . " Hour"; $sysInfo['uptime'] .= $min . " Minute"; // MEMORY if (false === ($buf = getKey("hw.physmem"))) { return false; } $sysInfo['memTotal'] = round($buf / 1024 / 1024, 2); $str = getKey("vm.vmtotal"); preg_match_all("/\nVirtual Memory[\:\s]*\(Total[\:\s]*([\d]+)K[\,\s]*Active[\:\s]*([\d]+)K\)\n/i", $str, $buff, PREG_SET_ORDER); preg_match_all("/\nReal Memory[\:\s]*\(Total[\:\s]*([\d]+)K[\,\s]*Active[\:\s]*([\d]+)K\)\n/i", $str, $buf, PREG_SET_ORDER); $sysInfo['memRealUsed'] = round($buf[0][2] / 1024, 2); $sysInfo['memCached'] = round($buff[0][2] / 1024, 2); $sysInfo['memUsed'] = round($buf[0][1] / 1024, 2) + $sysInfo['memCached']; $sysInfo['memFree'] = $sysInfo['memTotal'] - $sysInfo['memUsed']; $sysInfo['memPercent'] = (floatval($sysInfo['memTotal']) != 0) ? round($sysInfo['memUsed'] / $sysInfo['memTotal'] * 100, 2) : 0; $sysInfo['memRealPercent'] = (floatval($sysInfo['memTotal']) != 0) ? round($sysInfo['memRealUsed'] / $sysInfo['memTotal'] * 100, 2) : 0; break; default: break; } if(in_array(PHP_OS, ['Linux', 'FreeBSD'])) { if ($sysInfo['memTotal'] < 1024) { $memTotal = $sysInfo['memTotal'] . " M"; $mt = $sysInfo['memTotal'] . " M"; $mu = $sysInfo['memUsed'] . " M"; $mf = $sysInfo['memFree'] . " M"; $mc = $sysInfo['memCached'] . " M"; $mb = $sysInfo['memBuffers'] . " M"; $st = $sysInfo['swapTotal'] . " M"; $su = $sysInfo['swapUsed'] . " M"; $sf = $sysInfo['swapFree'] . " M"; $swapPercent = ($sysInfo['swapPercent']); $memRealUsed = $sysInfo['memRealUsed'] . " M"; $memRealFree = $sysInfo['memRealFree'] . " M"; $memRealPercent = ($sysInfo['memRealPercent']); $memPercent = ($sysInfo['memPercent']); $memCachedPercent = ($sysInfo['memCachedPercent']); } else { $memTotal = round($sysInfo['memTotal'] / 1024, 3) . " G"; $mt = round($sysInfo['memTotal'] / 1024, 3) . " G"; $mu = round($sysInfo['memUsed'] / 1024, 3) . " G"; $mf = round($sysInfo['memFree'] / 1024, 3) . " G"; $mc = round($sysInfo['memCached'] / 1024, 3) . " G"; $mb = round($sysInfo['memBuffers'] / 1024, 3) . " G"; $st = round($sysInfo['swapTotal'] / 1024, 3) . " G"; $su = round($sysInfo['swapUsed'] / 1024, 3) . " G"; $sf = round($sysInfo['swapFree'] / 1024, 3) . " G"; $swapPercent = ($sysInfo['swapPercent']); $memRealUsed = round($sysInfo['memRealUsed'] / 1024, 3) . " G"; $memRealFree = round($sysInfo['memRealFree'] / 1024, 3) . " G"; $memRealPercent = ($sysInfo['memRealPercent']); $memPercent = ($sysInfo['memPercent']); $memCachedPercent = ($sysInfo['memCachedPercent']); } $sysInfo = array_merge($sysInfo, [ 'memTotal' => $memTotal, 'mt' => $mt, 'mu' => $mu, 'mf' => $mf, 'mc' => $mc, 'mb' => $mb, 'st' => $st, 'su' => $su, 'sf' => $sf, 'swapPercent' => $swapPercent, 'memRealUsed' => $memRealUsed, 'memRealFree' => $memRealFree, 'memRealPercent' => $memRealPercent, 'memPercent' => $memPercent, 'memCachedPercent' => $memCachedPercent ]); } return $sysInfo; } /** * CPU 상세정보 */ private function getCpuInfo(): string { $stat1 = GetCoreInformation(); sleep(1); $stat2 = GetCoreInformation(); $data = GetCpuPercentages($stat1, $stat2); $ret = ''; if(isset($data['cpu0']['user'])) { $ret .= $data['cpu0']['user'] . "%us, "; } if(isset($data['cpu0']['sys'])) { $ret .= $data['cpu0']['sys'] . "%sy, "; } if(isset($data['cpu0']['nice'])) { $ret .= $data['cpu0']['nice'] . "%ni, "; } if(isset($data['cpu0']['idle'])) { $ret .= $data['cpu0']['idle'] . "%id, "; } if(isset($data['cpu0']['iowait'])) { $ret .= $data['cpu0']['iowait'] . "%wa, "; } if(isset($data['cpu0']['irq'])) { $ret .= $data['cpu0']['irq'] . "%irq, "; } if(isset($data['cpu0']['softirq'])) { $ret .= $data['cpu0']['softirq'] . "%softirq"; } return $ret; } /** * 사용 메모리 정보 */ private function getMemoryInfo(): array { $dt = round(@disk_total_space(".") / (1024 * 1024 * 1024), 3); $df = round(@disk_free_space(".") / (1024 * 1024 * 1024), 3); $du = ($dt - $df); //е·Із”Ё $hdPercent = ((floatval($dt) != 0) ? round($du / $dt * 100, 2) : 0); return ['dt' => $dt, 'df' => $df, 'du' => $du, 'hdPercent' => $hdPercent]; } /** * 네트워크 정보 조회 */ private function getNetworkInfo(): array { // 네트워크 정보 조회 $networkResult = []; $networkData = @file("/proc/net/dev"); if($networkData) { for ($i = 2; $i < count($networkData); $i++) { 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); $networkResult[$i - 2] = [ 'networkName' => $info[1][0], 'NetOutSpeed' => $info[10][0], 'NetInputSpeed' => $info[2][0], 'NetInput' => byteFormat($info[2][0]), 'NetOut' => byteFormat($info[10][0]), ]; } } return $networkResult; } /** * PHP 정보 * @method GET * @see /admin/config/server/php */ public function php() { ob_start(); phpinfo(); $phpinfo = ob_get_contents(); ob_end_clean(); $phpinfo = preg_replace('%^.*(.*).*$%ms', '$1', $phpinfo); ob_clean(); return view('admin.config.php.index', [ 'subject' => 'PHP 정보', 'phpinfo' => $phpinfo ]); } /** * DB 정보 * @method GET * @see /admin/config/server/db */ public function db() { return view('admin.config.db.index', [ 'subject' => 'DB 정보', 'database' => config('database'), 'drivers' => join(', ', \Illuminate\Support\Facades\DB::availableDrivers()) ]); } }