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

Posted

技术标签:

【中文标题】如何在没有 exec 的情况下获取 CPU 使用率和 RAM 使用率?【英文标题】:How to get CPU usage and RAM usage without exec? 【发布时间】:2011-06-09 23:56:19 【问题描述】:

VBulletin如何在不使用exec的情况下获取系统信息?在没有 exec 的情况下,我还能获得关于服务器的任何其他信息吗?我感兴趣:

使用的带宽 系统类型 CPU 速度/使用率/计数 内存使用情况

【问题讨论】:

我有一些在 Windows 上加载 cpu 的经验,我将其发布在:http://***.com/questions/7538251/how-can-i-get-the-cpu-and-memory-useage/13666951#13666951 希望对您有所帮助。 【参考方案1】:

使用PHPSysInfo

phpSysInfo 是一个开放源代码的 PHP 脚本,它显示有关正在访问的主机的信息。它将显示如下内容:

正常运行时间 CPU 内存 SCSI、IDE、PCI 以太网 软盘 视频信息

直接解析解析/proc,不使用exec


另一种方法是使用Linfo。这是一个非常快速的跨平台 php 脚本,它非常详细地描述了主机服务器,提供了诸如内存使用、磁盘空间、raid 阵列、硬件、网卡、内核、操作系统、samba/ 等信息cups/truecrypt 状态、临时工、磁盘等等。

【讨论】:

@Ronan - 它直接从 /proc 读取,前提是 open_basedir() 无效。所以,如果有这个限制,你应该回退到 exec()。 我的意思是它会在共享主机上工作还是需要启用某些功能(如 exec),我的脚本将被许多客户安装在许多托管计划/专用服务器和东西上,我需要一些东西处理所有事情,或者使用可以启用的功能...... @Ronan:是的,它不使用exec。尝试在您的网络服务器上安装该脚本以快速检查。它适用于我的共享服务器。 如果 PHPSysInfo 告诉我 file_exists(/proc/net/dev) 在我的机器上不存在怎么办? 作为来自未来某个人的旧帖子的注释;这些都在 GPL 下获得许可,而不是 MIT 或 Apache。所以你必须公开你的项目的来源;如果您打算将其用于不允许透露来源的商业应用程序,我会小心的。【参考方案2】:

这是我在 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) . '%';

RAM 占总使用的百分比(实时):

$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 的可悲部分 :)【参考方案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 中默认不启用 Windows 的 COM 扩展,当然也不会在生产模式下启用。【参考方案4】:

这是我使用的即时 CPU 使用率,没有 1 秒延迟

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

【讨论】:

支持这项工作,但这要么不起作用,要么只适用于一个核心或其他东西,当我的使用率为 9% 时,继续输出 1000【参考方案5】:

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

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

【讨论】:

这里不显示服务器上的总cpu使用情况,比如这个答案***.com/a/38085813/1920003

以上是关于如何在没有 exec 的情况下获取 CPU 使用率和 RAM 使用率?的主要内容,如果未能解决你的问题,请参考以下文章

PHP如何在windows下获取计算机的cpu和内存

有没有办法在没有 QApplication::exec() 的情况下使用 Qt?

Python如何获取Android系统下某一个APP的CPU,内存的使用情况

在没有 exec 的情况下创建 zip 或 tar.gz 存档

有没有办法在不等待命令完成的情况下使用 shell_exec ?

如何在 Python 中获取当前的 CPU 和 RAM 使用情况?