nas_docker_compose/kodbox/site/app/sdks/ServerInfo.class.php
2024-08-31 01:03:37 +08:00

150 lines
4.7 KiB
PHP
Executable File

<?php
/**
* 服务器信息
* CPU、内存使用率——mac未实现
*/
class ServerInfo {
function __construct() {
$this->sysOs = strtoupper(substr(PHP_OS, 0,3)) === 'WIN' ? 'win' : 'linux';
}
public function cpuUsage(){
$action = 'cpuUsage'.ucfirst($this->sysOs);
return $this->$action();
}
public function memUsage(){
$action = 'memUsage'.ucfirst($this->sysOs);
return $this->$action();
}
// 获取/proc/xx文件内容
private static function getFileContent($file){
static $readList = array();
if (!isset($readList[$file])) {
$readList[$file] = @is_readable($file);
}
if ($readList[$file]) {
return file_get_contents($file);
}
return shell_exec('cat '.$file);
}
/**
* cpu使用率-linux
* @return void
*/
public function cpuUsageLinux(){
$filePath = '/proc/stat';
$stat1 = self::getFileContent($filePath);
if (!$stat1) return 0;
sleep(1);
$stat2 = self::getFileContent($filePath);
$info1 = explode(" ", preg_replace("!cpu +!", "", $stat1));
$info2 = explode(" ", preg_replace("!cpu +!", "", $stat2));
$dif = array();
$dif['user'] = $info2[0] - $info1[0];
$dif['nice'] = $info2[1] - $info1[1];
$dif['sys'] = $info2[2] - $info1[2];
$dif['idle'] = $info2[3] - $info1[3];
$total = array_sum($dif);
return round(($total - $dif['idle']) / $total, 3);
}
/**
* 内存使用率-linux
* @return void
*/
public function memUsageLinux(){
$data = array(
'total' => self::getMemoryUsage('MemTotal'),
'used' => self::getMemoryUsage('MemRealUsage'),
);
return $data;
}
/**
* cpu使用率-win
* @return void
*/
public function cpuUsageWin(){
$str = shell_exec('powershell "Get-CimInstance -ClassName Win32_Processor | Select-Object -ExpandProperty LoadPercentage"');
return round(floatval($str), 1)/100;
// return trim($str) . '%';
}
/**
* 内存使用率-win
* @return void
*/
public function memUsageWin(){
$str = shell_exec('powershell "Get-CimInstance Win32_OperatingSystem | FL TotalVisibleMemorySize, FreePhysicalMemory"');
$list = explode("\n", trim($str));
$list = array_filter($list);
$data = array();
foreach($list as $value) {
$tmp = explode(':', $value);
$data[] = (float) trim($tmp[1]);
}
$data = array(
'total' => $data[0] * 1024,
'used' => ($data[0] - $data[1]) * 1024,
);
// $data['percent'] = !$data['total'] ? '0%' : sprintf("%.1f",$data['used']/$data['total']*100).'%';
return $data;
}
public static function getMemoryUsage($key){
$key = ucfirst($key);
static $memInfo = null;
if (null === $memInfo) {
$memInfoFile = '/proc/meminfo';
$memInfo = self::getFileContent($memInfoFile);
if (!$memInfo) {
$memInfo = 0;
return 0;
}
$memInfo = str_replace(array(
' kB',
' ',
), '', $memInfo);
$lines = array();
foreach (explode("\n", $memInfo) as $line) {
if (!$line) {
continue;
}
$line = explode(':', $line);
$lines[$line[0]] = (float)$line[1] * 1024;
}
$memInfo = $lines;
}
if (!isset($memInfo['MemTotal'])){
return 0;
}
switch ($key) {
case 'MemRealUsage':
if (isset($memInfo['MemAvailable'])) {
return $memInfo['MemTotal'] - $memInfo['MemAvailable'];
}
if (isset($memInfo['MemFree'])) {
if (isset($memInfo['Buffers'], $memInfo['Cached'])) {
return $memInfo['MemTotal'] - $memInfo['MemFree'] - $memInfo['Buffers'] - $memInfo['Cached'];
}
return $memInfo['MemTotal'] - $memInfo['Buffers'];
}
return 0;
case 'MemUsage':
return isset($memInfo['MemFree']) ? $memInfo['MemTotal'] - $memInfo['MemFree'] : 0;
case 'SwapUsage':
if ( ! isset($memInfo['SwapTotal']) || ! isset($memInfo['SwapFree'])) {
return 0;
}
return $memInfo['SwapTotal'] - $memInfo['SwapFree'];
}
return isset($memInfo[$key]) ? $memInfo[$key] : 0;
}
}