getSystemInfo(); $serverInfo = $this->getServerInfo(); $databaseInfo = $this->getDatabaseInfo(); $cacheInfo = $this->getCacheInfo(); $storageInfo = $this->getStorageInfo(); $phpConfigInfo = $this->getPhpConfigInfo(); $performanceInfo = $this->getPerformanceInfo(); $this->assign('systemInfo', $systemInfo); $this->assign('serverInfo', $serverInfo); $this->assign('databaseInfo', $databaseInfo); $this->assign('cacheInfo', $cacheInfo); $this->assign('storageInfo', $storageInfo); $this->assign('phpConfigInfo', $phpConfigInfo); $this->assign('performanceInfo', $performanceInfo); return $this->fetch(); } protected function getSystemInfo() { return [ 'framework' => 'Ulthon Admin', 'version' => Version::VERSION, 'product_version' => Version::PRODUCT_VERSION ?: Version::VERSION, 'layui_version' => Version::LAYUI_VERSION, 'thinkphp_version' => app()->version(), 'php_version' => PHP_VERSION, 'server_time' => date('Y-m-d H:i:s'), 'timezone' => date_default_timezone_get(), ]; } protected function getServerInfo() { $serverSoftware = $_SERVER['SERVER_SOFTWARE'] ?? 'Unknown'; $os = PHP_OS; $sapi = php_sapi_name(); $ip = $_SERVER['SERVER_ADDR'] ?? '127.0.0.1'; $port = $_SERVER['SERVER_PORT'] ?? '80'; return [ 'server_software' => $serverSoftware, 'os' => $os, 'sapi' => $sapi, 'ip' => $ip, 'port' => $port, ]; } protected function getDatabaseInfo() { $connectionName = Config::get('database.default', 'mysql'); $dbConfig = Config::get('database.connections.' . $connectionName); $info = [ 'type' => $dbConfig['type'] ?? 'Unknown', 'hostname' => $dbConfig['hostname'] ?? 'Unknown', 'database' => $dbConfig['database'] ?? 'Unknown', 'prefix' => $dbConfig['prefix'] ?? '', 'charset' => $dbConfig['charset'] ?? 'Unknown', 'status' => 'unknown', 'version' => 'Unknown', 'table_count' => 0, ]; try { $connection = Db::connect($connectionName); $version = $connection->query('SELECT VERSION() as version')[0]['version'] ?? 'Unknown'; $prefix = $dbConfig['prefix'] ?? ''; $tableCount = 0; if ($prefix) { $tables = $connection->query("SHOW TABLES LIKE '{$prefix}%'"); $tableCount = count($tables); } else { $tables = $connection->query('SHOW TABLES'); $tableCount = count($tables); } $info['status'] = 'connected'; $info['version'] = $version; $info['table_count'] = $tableCount; } catch (\Exception $e) { $info['status'] = 'error'; $info['error'] = $e->getMessage(); } return $info; } protected function getCacheInfo() { $defaultDriver = Config::get('cache.default'); $cacheConfig = Config::get('cache.stores.' . $defaultDriver); $info = [ 'default_driver' => $defaultDriver, 'type' => $cacheConfig['type'] ?? 'Unknown', 'path' => $cacheConfig['path'] ?? '', 'prefix' => $cacheConfig['prefix'] ?? '', 'expire' => $cacheConfig['expire'] ?? 0, 'status' => 'unknown', ]; try { $testKey = 'system_status_test_' . time(); Cache::set($testKey, 'test', 10); $testValue = Cache::get($testKey); Cache::delete($testKey); if ($testValue === 'test') { $info['status'] = 'available'; } else { $info['status'] = 'error'; } } catch (\Exception $e) { $info['status'] = 'error'; $info['error'] = $e->getMessage(); } return $info; } protected function getStorageInfo() { $rootPath = app()->getRootPath(); $freeBytes = disk_free_space($rootPath); $totalBytes = disk_total_space($rootPath); $usedBytes = $totalBytes - $freeBytes; $usagePercent = ($usedBytes / $totalBytes) * 100; return [ 'root_path' => $rootPath, 'total' => $this->formatBytes($totalBytes), 'free' => $this->formatBytes($freeBytes), 'used' => $this->formatBytes($usedBytes), 'usage_percent' => round($usagePercent, 2), ]; } protected function getPhpConfigInfo() { return [ 'upload_max_filesize' => ini_get('upload_max_filesize'), 'post_max_size' => ini_get('post_max_size'), 'memory_limit' => ini_get('memory_limit'), 'max_execution_time' => ini_get('max_execution_time') . 's', 'max_input_time' => ini_get('max_input_time') . 's', 'safe_mode' => ini_get('safe_mode') ? 'On' : 'Off', 'allow_url_fopen' => ini_get('allow_url_fopen') ? 'On' : 'Off', 'file_uploads' => ini_get('file_uploads') ? 'On' : 'Off', 'disabled_functions' => ini_get('disable_functions') ?: 'None', ]; } protected function getPerformanceInfo() { $memoryUsage = memory_get_usage(true); $memoryLimit = $this->convertToBytes(ini_get('memory_limit')); $memoryPercent = $memoryLimit > 0 ? ($memoryUsage / $memoryLimit) * 100 : 0; return [ 'memory_usage' => $this->formatBytes($memoryUsage), 'memory_limit' => $this->formatBytes($memoryLimit), 'memory_percent' => round($memoryPercent, 2), 'peak_memory' => $this->formatBytes(memory_get_peak_usage(true)), 'load_average' => function_exists('sys_getloadavg') ? implode(', ', sys_getloadavg()) : 'N/A', ]; } protected function formatBytes($bytes, $precision = 2) { $units = ['B', 'KB', 'MB', 'GB', 'TB']; for ($i = 0; $bytes > 1024 && $i < count($units) - 1; $i++) { $bytes /= 1024; } return round($bytes, $precision) . ' ' . $units[$i]; } protected function convertToBytes($value) { $value = trim($value); $unit = strtolower($value[strlen($value) - 1]); $value = (float) $value; switch ($unit) { case 'g': $value *= 1024; case 'm': $value *= 1024; case 'k': $value *= 1024; } return $value; } }