效果
先来个效果图,前端UI来自layui的progress组件。
![]()
制作
首先尝试了几个不同的方法
- getrusage函数
(PHP 4, PHP 5, PHP 7)
getrusage — 获取当前资源使用状况
找了很久的资料,大多是说计算PHP自身消耗的资源而不是服务器资源的统计,所以这里没有深入研究
2.使用popen()执行shell
如果发现无法使用peopn函数,请先检查该函数是否存在在php.ini的disable_functions里。
我参考了这篇文章 获取linux服务器性能CPU、内存、硬盘等使用率 PHP,尝试是否能够获取到数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| <?php $fp = popen('top -b -n 2 | grep -E "^(Cpu|Mem|Tasks)"',"r"); $rs = ""; while(!feof($fp)){ $rs .= fread($fp,1024); } pclose($fp); $sys_info = explode("\n",$rs); $tast_info = explode(",",$sys_info[3]); $cpu_info = explode(",",$sys_info[4]); $mem_info = explode(",",$sys_info[5]); $tast_running = trim(trim($tast_info[1],'running')); $cpu_usage = trim(trim($cpu_info[0],'Cpu(s): '),'%us'); $mem_total = trim(trim($mem_info[0],'Mem: '),'k total'); $mem_used = trim($mem_info[1],'k used'); $mem_usage = round(100*intval($mem_used)/intval($mem_total),2); $fp = popen('df -lh | grep -E "^(/)"',"r"); $rs = fread($fp,1024); pclose($fp); $rs = preg_replace("/\s{2,}/",' ',$rs); $hd = explode(" ",$rs); $hd_avail = trim($hd[3],'G'); $hd_usage = trim($hd[4],'%');
|
奇怪的是,在本地能够正常获取到的代码部署到线上服务器时代码会出现各种各样的错误。
于是打开了putty尝试在线上运行这个指令
top -b -n 2 | grep -E “^(Cpu|Mem|Tasks)”
![]()
emmm看来数据获取有问题,因为对Linux指令并不是很熟悉。我先尝试单独执行top命令试一试
top -b -n 2
能够正常打印出进程,这时候我关注到第一行的CPU和MEM前有一个%符号,看来问题出现在grep的表达式里。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
尝试把指令更改为
top -b -n 2 | grep -E “(Cpu|Mem|Tasks)”
则能正常获取到数据
![]()
之后的工作就是修改代码里的trim和数组下标的问题就搞定了。