Как получить использование процессора и оперативной памяти без exec?
Как VBulletin получает информацию о системе без использования exec
? Есть ли другая информация, которую я могу получить о сервере без exec? Меня интересует:
- используемая полоса пропускания
- Тип системы
- скорость процессора / использование / количество
- использование оперативной памяти
4 ответа:
Используйте PHPSysInfo Библиотека
PhpSysInfo-это PHP-скрипт с открытым исходным кодом, который отображает информацию о хосте, к которому осуществляется доступ. Он будет отображать такие вещи, как:
- аптайм
- CPU
- Память
- SCSI, IDE, PCI
- Ethernet
- дискета
- Видеоинформация
Он непосредственно разбирает разборы
/proc
и не используетexec
.
Другой способ-использовать Linfo. Это очень быстро кросс-платформенный PHP-скрипт, который описывает хост-сервере в экстремальных подробно, давая такую информацию, как использование памяти, дисковое пространство, RAID-массивы, аппаратные средства, сетевые карты, ядра, ОС, Самба/чашки/с TrueCrypt состояние, Томпа, диски, и многое другое.
Это то, что я использую на серверах Linux. Он все еще использует
exec
, но другие вопросы указывают здесь как дубликат, и для них нет [хорошего] предложения. Он должен работать на каждом дистрибутиве, но если это не так, попробуйте возиться с$get_cores + 1
смещением.Процессор в процентах используемых ядер (5 мин в среднем):
$exec_loads = sys_getloadavg(); $exec_cores = trim(shell_exec("grep -P '^processor' /proc/cpuinfo|wc -l")); $cpu = round($exec_loads[1]/($exec_cores + 1)*100, 0) . '%';
Оперативная память в процентах от общего количества используемых (в реальном времени):
$exec_free = explode("\n", trim(shell_exec('free'))); $get_mem = preg_split("/[\s]+/", $exec_free[1]); $mem = round($get_mem[2]/$get_mem[1]*100, 0) . '%';
ОЗУ в ГБ используется (в реальном времени):
$exec_free = explode("\n", trim(shell_exec('free'))); $get_mem = preg_split("/[\s]+/", $exec_free[1]); $mem = number_format(round($get_mem[2]/1024/1024, 2), 2) . '/' . number_format(round($get_mem[1]/1024/1024, 2), 2);
Вот что находится в массиве
$get_mem
, Если вам нужно вычислить другое грани:[0]=>row_title [1]=>mem_total [2]=>mem_used [3]=>mem_free [4]=>mem_shared [5]=>mem_buffers [6]=>mem_cached
Бонус, вот как получить аптайм:
$exec_uptime = preg_split("/[\s]+/", trim(shell_exec('uptime'))); $uptime = $exec_uptime[2] . ' Days';
<?php function get_server_load() { $load=array(); if (stristr(PHP_OS, 'win')) { $wmi = new COM("Winmgmts://"); $server = $wmi->execquery("SELECT LoadPercentage FROM Win32_Processor"); $cpu_num = 0; $load_total = 0; foreach($server as $cpu) { $cpu_num++; $load_total += $cpu->loadpercentage; } $load[]= round($load_total/$cpu_num); } else { $load = sys_getloadavg(); } return $load; } echo implode(' ',get_server_load());
После поиска на форумах и перепробования многих методов, Наиболее точным является следующее:
$stat1 = file('/proc/stat'); sleep(1); $stat2 = file('/proc/stat'); $info1 = explode(" ", preg_replace("!cpu +!", "", $stat1[0])); $info2 = explode(" ", preg_replace("!cpu +!", "", $stat2[0])); $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); $cpu = array(); foreach($dif as $x=>$y) $cpu[$x] = round($y / $total * 100, 1); print_r($cpu);