|
@@ -256,10 +256,12 @@ class Index extends Base
|
|
|
public function get_system_status()
|
|
public function get_system_status()
|
|
|
{
|
|
{
|
|
|
//判斷系統
|
|
//判斷系統
|
|
|
- $os_name = strtoupper(substr(PHP_OS, 0, 3));
|
|
|
|
|
|
|
+ $os_name = PHP_OS;
|
|
|
$os_data = [];
|
|
$os_data = [];
|
|
|
- $os_data['os_name'] = '';
|
|
|
|
|
- if ($os_name == 'WIN') {
|
|
|
|
|
|
|
+ $os_data['os_name'] = $os_name;
|
|
|
|
|
+
|
|
|
|
|
+ if (strtoupper(substr($os_name, 0, 3)) === 'WIN') {
|
|
|
|
|
+ // Windows系统
|
|
|
$os_data['os_name'] = 'WINDOWS';
|
|
$os_data['os_name'] = 'WINDOWS';
|
|
|
$os_data['disk_datas'] = $this->get_spec_disk('all');
|
|
$os_data['disk_datas'] = $this->get_spec_disk('all');
|
|
|
$os_data['cpu_usage'] = $this->getCpuUsage();
|
|
$os_data['cpu_usage'] = $this->getCpuUsage();
|
|
@@ -267,48 +269,28 @@ class Index extends Base
|
|
|
$os_data['mem_usage'] = $mem_arr['usage'];
|
|
$os_data['mem_usage'] = $mem_arr['usage'];
|
|
|
$os_data['mem_total'] = round($mem_arr['TotalVisibleMemorySize'] / 1024, 2);
|
|
$os_data['mem_total'] = round($mem_arr['TotalVisibleMemorySize'] / 1024, 2);
|
|
|
$os_data['mem_used'] = $os_data['mem_total'] - round($mem_arr['FreePhysicalMemory'] / 1024, 2);
|
|
$os_data['mem_used'] = $os_data['mem_total'] - round($mem_arr['FreePhysicalMemory'] / 1024, 2);
|
|
|
- } else if ($os_name == 'LIN') {
|
|
|
|
|
- $os_data['os_name'] = 'LINUX';
|
|
|
|
|
- $totalSpace = disk_total_space('/'); // 获取根目录的总容量
|
|
|
|
|
- $freeSpace = disk_free_space('/'); // 获取根目录的可用容量
|
|
|
|
|
- $totalSpaceGB = $totalSpace / (1024 * 1024 * 1024); // 将总容量转换为GB
|
|
|
|
|
- $freeSpaceGB = $freeSpace / (1024 * 1024 * 1024); // 将可用容量转换为GB
|
|
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // Linux和FreeBSD的处理逻辑
|
|
|
|
|
+ $os_data['os_name'] = strtoupper($os_name);
|
|
|
|
|
+
|
|
|
|
|
+ // 获取磁盘信息
|
|
|
|
|
+ $totalSpace = disk_total_space('/');
|
|
|
|
|
+ $freeSpace = disk_free_space('/');
|
|
|
|
|
+ $totalSpaceGB = $totalSpace / (1024 * 1024 * 1024);
|
|
|
|
|
+ $freeSpaceGB = $freeSpace / (1024 * 1024 * 1024);
|
|
|
$tmp_disk_data = [];
|
|
$tmp_disk_data = [];
|
|
|
$tmp_disk_data[0] = $totalSpaceGB - $freeSpaceGB;
|
|
$tmp_disk_data[0] = $totalSpaceGB - $freeSpaceGB;
|
|
|
$tmp_disk_data[1] = $totalSpaceGB;
|
|
$tmp_disk_data[1] = $totalSpaceGB;
|
|
|
- if ($totalSpaceGB != 0) {
|
|
|
|
|
- $tmp_disk_data[2] = (100 - round(($freeSpaceGB / $totalSpaceGB) * 100, 2));
|
|
|
|
|
- } else {
|
|
|
|
|
- $tmp_disk_data[2] = 0;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ $tmp_disk_data[2] = (100 - round(($freeSpaceGB / $totalSpaceGB) * 100, 2));
|
|
|
$os_data['disk_datas']['/'] = $tmp_disk_data;
|
|
$os_data['disk_datas']['/'] = $tmp_disk_data;
|
|
|
- $mem_arr = $this->get_linux_server_memory_usage();
|
|
|
|
|
|
|
+
|
|
|
|
|
+ // 获取内存和CPU信息
|
|
|
|
|
+ $mem_arr = $this->get_unix_server_memory_usage();
|
|
|
|
|
+ $os_data['cpu_usage'] = $this->get_unix_server_cpu_usage();
|
|
|
|
|
+
|
|
|
$os_data['mem_usage'] = $mem_arr['usage'];
|
|
$os_data['mem_usage'] = $mem_arr['usage'];
|
|
|
$os_data['mem_used'] = $mem_arr['used'];
|
|
$os_data['mem_used'] = $mem_arr['used'];
|
|
|
$os_data['mem_total'] = $mem_arr['total'];
|
|
$os_data['mem_total'] = $mem_arr['total'];
|
|
|
- $os_data['cpu_usage'] = $this->get_linux_server_cpu_usage()['usage'];
|
|
|
|
|
- // if (is_readable("/proc/stat")) {
|
|
|
|
|
- // $statData1 = $this->_getServerLoadLinuxData();
|
|
|
|
|
- // sleep(0.5);
|
|
|
|
|
- // $statData2 = $this->_getServerLoadLinuxData();
|
|
|
|
|
- // if (
|
|
|
|
|
- // (!is_null($statData1)) &&
|
|
|
|
|
- // (!is_null($statData2))
|
|
|
|
|
- // ) {
|
|
|
|
|
- // $statData2[0] -= $statData1[0];
|
|
|
|
|
- // $statData2[1] -= $statData1[1];
|
|
|
|
|
- // $statData2[2] -= $statData1[2];
|
|
|
|
|
- // $statData2[3] -= $statData1[3];
|
|
|
|
|
-
|
|
|
|
|
- // $cpuTime = $statData2[0] + $statData2[1] + $statData2[2] + $statData2[3];
|
|
|
|
|
-
|
|
|
|
|
- // if ($cpuTime > 0) {
|
|
|
|
|
- // $os_data['cpu_usage'] = 100 - ($statData2[3] * 100 / $cpuTime);
|
|
|
|
|
- // } else {
|
|
|
|
|
- // $os_data['cpu_usage'] = 0;
|
|
|
|
|
- // }
|
|
|
|
|
- // }
|
|
|
|
|
- // }
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return $os_data;
|
|
return $os_data;
|
|
@@ -441,46 +423,196 @@ class Index extends Base
|
|
|
return $memory;
|
|
return $memory;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private function get_linux_server_memory_usage()
|
|
|
|
|
|
|
+ private function get_unix_server_memory_usage()
|
|
|
{
|
|
{
|
|
|
- $free = shell_exec('free');
|
|
|
|
|
- $free = (string)trim($free);
|
|
|
|
|
- $free_arr = explode("\n", $free);
|
|
|
|
|
- $mem = explode(" ", $free_arr[1]);
|
|
|
|
|
- $mem = array_filter($mem);
|
|
|
|
|
- $mem = array_merge($mem);
|
|
|
|
|
- $memory_usage = 0;
|
|
|
|
|
- if ($mem[1] != 0) {
|
|
|
|
|
- $memory_usage = $mem[2] / $mem[1] * 100;
|
|
|
|
|
- }
|
|
|
|
|
- $mem_array = [];
|
|
|
|
|
- $mem_array['total'] = round($mem[1] / 1024, 2);
|
|
|
|
|
- $mem_array['used'] = round($mem[2] / 1024, 2);
|
|
|
|
|
- $mem_array['usage'] = round($memory_usage, 2);
|
|
|
|
|
- return $mem_array;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- private function get_linux_server_cpu_usage()
|
|
|
|
|
- {
|
|
|
|
|
- $cpu_load = shell_exec("top -bn1 | grep 'Cpu(s)'");
|
|
|
|
|
-
|
|
|
|
|
- if (empty($cpu_load)) {
|
|
|
|
|
- return ['error' => 'Failed to retrieve CPU usage.'];
|
|
|
|
|
|
|
+ // 首先尝试使用通用的 sysinfo 方法
|
|
|
|
|
+ if (function_exists('sysinfo')) {
|
|
|
|
|
+ $si = sysinfo();
|
|
|
|
|
+ if ($si) {
|
|
|
|
|
+ $total_mem = $si['totalram'] * $si['mem_unit'] / 1024 / 1024;
|
|
|
|
|
+ $free_mem = $si['freeram'] * $si['mem_unit'] / 1024 / 1024;
|
|
|
|
|
+ $used_mem = $total_mem - $free_mem;
|
|
|
|
|
+ $usage = ($used_mem / $total_mem) * 100;
|
|
|
|
|
+
|
|
|
|
|
+ return [
|
|
|
|
|
+ 'total' => round($total_mem, 2),
|
|
|
|
|
+ 'used' => round($used_mem, 2),
|
|
|
|
|
+ 'usage' => round($usage, 2)
|
|
|
|
|
+ ];
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- preg_match('/\s([\d.]+)\s*us/', $cpu_load, $matches);
|
|
|
|
|
-
|
|
|
|
|
- if (isset($matches[1]) && is_numeric($matches[1])) {
|
|
|
|
|
- $cpu_usage = (float)$matches[1];
|
|
|
|
|
- } else {
|
|
|
|
|
- return ['error' => 'Failed to parse CPU usage.'];
|
|
|
|
|
|
|
+ // 尝试不同的内存信息获取方法
|
|
|
|
|
+ $methods = [
|
|
|
|
|
+ // Linux free 命令
|
|
|
|
|
+ 'free' => function() {
|
|
|
|
|
+ $free = shell_exec('free');
|
|
|
|
|
+ if ($free) {
|
|
|
|
|
+ $free = (string)trim($free);
|
|
|
|
|
+ $free_arr = explode("\n", $free);
|
|
|
|
|
+ $mem = explode(" ", $free_arr[1]);
|
|
|
|
|
+ $mem = array_filter($mem);
|
|
|
|
|
+ $mem = array_merge($mem);
|
|
|
|
|
+
|
|
|
|
|
+ if (count($mem) >= 3 && !empty($mem[1])) {
|
|
|
|
|
+ return [
|
|
|
|
|
+ 'total' => round($mem[1] / 1024, 2),
|
|
|
|
|
+ 'used' => round($mem[2] / 1024, 2),
|
|
|
|
|
+ 'usage' => round($mem[2] / $mem[1] * 100, 2)
|
|
|
|
|
+ ];
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return null;
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ // FreeBSD/Unix sysctl 命令
|
|
|
|
|
+ 'sysctl' => function() {
|
|
|
|
|
+ $sysctl = shell_exec('/sbin/sysctl -n hw.physmem hw.pagesize vm.stats.vm.v_free_count 2>/dev/null');
|
|
|
|
|
+ if ($sysctl) {
|
|
|
|
|
+ $lines = explode("\n", trim($sysctl));
|
|
|
|
|
+ if (count($lines) >= 3 && !empty($lines[0])) {
|
|
|
|
|
+ $total_mem = $lines[0] / 1024 / 1024;
|
|
|
|
|
+ $page_size = $lines[1];
|
|
|
|
|
+ $free_pages = $lines[2];
|
|
|
|
|
+ $free_mem = ($free_pages * $page_size) / 1024 / 1024;
|
|
|
|
|
+ $used_mem = $total_mem - $free_mem;
|
|
|
|
|
+ $usage = $total_mem > 0 ? ($used_mem / $total_mem) * 100 : 0;
|
|
|
|
|
+
|
|
|
|
|
+ return [
|
|
|
|
|
+ 'total' => round($total_mem, 2),
|
|
|
|
|
+ 'used' => round($used_mem, 2),
|
|
|
|
|
+ 'usage' => round($usage, 2)
|
|
|
|
|
+ ];
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return null;
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ // /proc/meminfo 文件读取
|
|
|
|
|
+ 'proc' => function() {
|
|
|
|
|
+ if (is_readable('/proc/meminfo')) {
|
|
|
|
|
+ $meminfo = file_get_contents('/proc/meminfo');
|
|
|
|
|
+ if ($meminfo) {
|
|
|
|
|
+ preg_match('/MemTotal:\s+(\d+)/i', $meminfo, $total);
|
|
|
|
|
+ preg_match('/MemFree:\s+(\d+)/i', $meminfo, $free);
|
|
|
|
|
+ preg_match('/Cached:\s+(\d+)/i', $meminfo, $cached);
|
|
|
|
|
+ preg_match('/Buffers:\s+(\d+)/i', $meminfo, $buffers);
|
|
|
|
|
+
|
|
|
|
|
+ if (isset($total[1]) && isset($free[1])) {
|
|
|
|
|
+ $total_mem = $total[1] / 1024;
|
|
|
|
|
+ $free_mem = ($free[1] + (isset($cached[1]) ? $cached[1] : 0) + (isset($buffers[1]) ? $buffers[1] : 0)) / 1024;
|
|
|
|
|
+ $used_mem = $total_mem - $free_mem;
|
|
|
|
|
+ $usage = ($used_mem / $total_mem) * 100;
|
|
|
|
|
+
|
|
|
|
|
+ return [
|
|
|
|
|
+ 'total' => round($total_mem, 2),
|
|
|
|
|
+ 'used' => round($used_mem, 2),
|
|
|
|
|
+ 'usage' => round($usage, 2)
|
|
|
|
|
+ ];
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ ];
|
|
|
|
|
+
|
|
|
|
|
+ // 依次尝试各种方法
|
|
|
|
|
+ foreach ($methods as $method) {
|
|
|
|
|
+ $result = $method();
|
|
|
|
|
+ if ($result !== null) {
|
|
|
|
|
+ return $result;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
|
|
+ // 如果所有方法都失败,返回默认值
|
|
|
return [
|
|
return [
|
|
|
- 'usage' => round($cpu_usage, 2)
|
|
|
|
|
|
|
+ 'total' => 0,
|
|
|
|
|
+ 'used' => 0,
|
|
|
|
|
+ 'usage' => 0
|
|
|
];
|
|
];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ private function get_unix_server_cpu_usage()
|
|
|
|
|
+ {
|
|
|
|
|
+ // 首先尝试使用通用的方法
|
|
|
|
|
+ $methods = [
|
|
|
|
|
+ // top 命令 (Linux)
|
|
|
|
|
+ 'top_linux' => function() {
|
|
|
|
|
+ $cpu_load = shell_exec("top -bn1 | grep 'Cpu(s)' 2>/dev/null");
|
|
|
|
|
+ if (!empty($cpu_load)) {
|
|
|
|
|
+ if (preg_match('/(\d+[.,]\d+).*?us/', $cpu_load, $matches)) {
|
|
|
|
|
+ return round((float)str_replace(',', '.', $matches[1]), 2);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return null;
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ // top 命令 (FreeBSD)
|
|
|
|
|
+ 'top_bsd' => function() {
|
|
|
|
|
+ $cpu_load = shell_exec("top -d2 -n1 | grep 'CPU:' 2>/dev/null");
|
|
|
|
|
+ if (!empty($cpu_load)) {
|
|
|
|
|
+ if (preg_match('/(\d+\.\d+)%\s+user/', $cpu_load, $matches)) {
|
|
|
|
|
+ return round((float)$matches[1], 2);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return null;
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ // sysctl (FreeBSD/Unix)
|
|
|
|
|
+ 'sysctl' => function() {
|
|
|
|
|
+ $cpu_load = shell_exec('/sbin/sysctl -n kern.cp_time 2>/dev/null');
|
|
|
|
|
+ if (!empty($cpu_load)) {
|
|
|
|
|
+ $times = explode(" ", trim($cpu_load));
|
|
|
|
|
+ if (count($times) >= 5) {
|
|
|
|
|
+ $total = array_sum($times);
|
|
|
|
|
+ $idle = $times[4];
|
|
|
|
|
+ return $total > 0 ? round(100 - ($idle * 100 / $total), 2) : 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return null;
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ // /proc/stat 文件读取
|
|
|
|
|
+ 'proc' => function() {
|
|
|
|
|
+ if (is_readable('/proc/stat')) {
|
|
|
|
|
+ $stats1 = file_get_contents('/proc/stat');
|
|
|
|
|
+ usleep(100000); // 等待100ms
|
|
|
|
|
+ $stats2 = file_get_contents('/proc/stat');
|
|
|
|
|
+
|
|
|
|
|
+ if ($stats1 && $stats2) {
|
|
|
|
|
+ $stats_arr1 = explode(' ', trim(explode("\n", $stats1)[0]));
|
|
|
|
|
+ $stats_arr2 = explode(' ', trim(explode("\n", $stats2)[0]));
|
|
|
|
|
+
|
|
|
|
|
+ if (count($stats_arr1) >= 5 && count($stats_arr2) >= 5) {
|
|
|
|
|
+ $cpu1 = array_sum(array_slice($stats_arr1, 1));
|
|
|
|
|
+ $cpu2 = array_sum(array_slice($stats_arr2, 1));
|
|
|
|
|
+ $idle1 = $stats_arr1[4];
|
|
|
|
|
+ $idle2 = $stats_arr2[4];
|
|
|
|
|
+
|
|
|
|
|
+ $diff_cpu = $cpu2 - $cpu1;
|
|
|
|
|
+ $diff_idle = $idle2 - $idle1;
|
|
|
|
|
+
|
|
|
|
|
+ if ($diff_cpu > 0) {
|
|
|
|
|
+ return round(100 * (1 - $diff_idle / $diff_cpu), 2);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ ];
|
|
|
|
|
+
|
|
|
|
|
+ // 依次尝试各种方法
|
|
|
|
|
+ foreach ($methods as $method) {
|
|
|
|
|
+ $result = $method();
|
|
|
|
|
+ if ($result !== null) {
|
|
|
|
|
+ return $result;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return 0;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private function _getServerLoadLinuxData()
|
|
private function _getServerLoadLinuxData()
|
|
|
{
|
|
{
|
|
|
if (is_readable("/proc/stat")) {
|
|
if (is_readable("/proc/stat")) {
|