如何在不使用exec的情况下获取CPU和RAM的使用情况?

32
VBulletin如何在没有使用exec的情况下获取系统信息?除了exec,我还能得到有关服务器的其他信息吗?我感兴趣的是:
  • 已使用的带宽
  • 系统类型
  • CPU速度/使用率/计数
  • 内存使用情况

1
我有一些在Windows上获取CPU负载的经验,并将其发布在以下链接中: https://dev59.com/flvUa4cB1Zd3GeqPu5fA#13666951 希望它能帮到你。 - user1438910
5个回答

51

使用PHPSysInfo

phpSysInfo是一个开源的PHP脚本,用于显示正在被访问的主机信息。它将显示以下内容:

  • 运行时间
  • CPU
  • 内存
  • SCSI、IDE、PCI
  • Ethernet
  • Floppy
  • 视频信息

它直接解析/proc而不使用exec


另一种方法是使用Linfo。这是一个非常快速的跨平台php脚本,可以极其详细地描述主机服务器,提供诸如RAM使用情况、磁盘空间、RAID阵列、硬件、网络卡、内核、操作系统、samba/cups/truecrypt状态、温度、磁盘等信息。


@Ronan - 它直接从/proc中读取,前提是没有开启open_basedir()限制。因此,如果有该限制,则应退而使用exec()。 - Tim Post
我的意思是,它能在共享主机上运行吗?还是需要启用一些功能(如exec)?我的脚本将被许多客户安装在许多托管计划/专用服务器和其他设备上,我需要一些东西可以在所有设备上运行,或者使用可以启用的功能... - Rami Dabain
@Ronan:是的,它不使用 exec。尝试在您的 Web 服务器上安装该脚本以快速检查。它在我的共享服务器上可以运行。 - shamittomar
如果PHPSysInfo告诉我我的机器上不存在file_exists(/proc/net/dev)该怎么办? - user1322720
作为对某位来自未来的老帖子的注释:这两个项目都是根据GPL许可证授权的,而不是MIT或Apache。因此,您必须披露您项目的源代码;如果您计划将其用于商业应用程序且不允许披露源代码,则需要小心。 - RMSD
使用这个库非常有用。我注意到当将其添加到URL字符串中时,也可以以XML或JSON格式获取信息,例如:**/phpsysinfo/xml.php?plugin=complete&json**,就像它在主页上展示的那样。 - JamLizzy101

11

这是我在Linux服务器上使用的方法。它仍然使用 exec ,但其他问题将其视为重复,并且没有[好的]建议提供给那些问题。它应该适用于每个发行版,但如果不行,请尝试调整 $ get_cores+1 偏移量。

CPU使用率(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) . '%';

实时使用的RAM(以GB为单位):

$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';

可悲的是它使用了exec :) - Rami Dabain

3
<?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());

PHP 的 COM 扩展在 Windows 系统中默认情况下并未启用,尤其是在生产环境下更不会启用。 - Tim

3

这是我用来实时获取CPU使用率而无需1秒延迟的方法

$cpu = shell_exec('top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk \'{print 100 - $1}\'');

赞同你的努力,但这要么不起作用,要么只在一个核心上工作,或者其他什么问题,它一直输出1000,而我的使用率只有9%。 - Lynob

0

在论坛上搜索并尝试了许多方法后,最准确的方法是这个:

$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);

1
这不会显示服务器的总CPU使用情况,就像这个答案所示:https://dev59.com/j2445IYBdhLWcg3wws8u#38085813 - Lynob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接