AI摘要
本文介绍了如何在Typecho的handsome主题中添加服务器状态栏。首先,通过修改headnav.php文件,添加服务器状态栏的HTML代码。然后,在主题设置中添加自定义的JavaScript代码,用于动态显示服务器状态信息。最后,创建serverInfo.php文件,用于提供服务器状态数据。通过这些步骤,可以在网站页面上实时显示服务器的CPU占用、内存使用、磁盘使用等信息。
效果图:
文件修改 headnav.php 文件路径:usr/themes/handsome/component/headnav.php,具体位置如下图,位于两个</li>
中间
展开查看详情
<!-- handsome主题-添加服务器状态栏 -->
<li class="dropdown pos-stc" id="StateDataPos">
<a id="StateData" href="#" data-toggle="dropdown" class="dropdown-toggle feathericons dropdown-toggle">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-activity"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"></polyline></svg>
<span class="caret"></span>
</a>
<div class="dropdown-menu wrapper w-full bg-white">
<div class="row">
<div class="col-sm-4 b-l b-light">
<div class="m-t-xs m-b-xs font-bold">运行状态</div>
<div class="">
<span class="pull-right text-danger" id="cpu">
<i class="fa fa-spinner fa-spin" aria-hidden="true"></i>
</span>
<span>CPU占用
<span class="badge badge-sm bg-info" id="cpu_cores">
<i class="fa fa-spinner fa-spin" aria-hidden="true"></i>
</span>
</span>
</div>
<div class="progress progress-xs m-t-sm bg-default">
<div id="cpu_css" class="progress-bar bg-danger" data-toggle="tooltip" style="width: 100%"></div>
</div>
<div class="">
<span class="pull-right text-danger" id="memory">
<i class="fa fa-spinner fa-spin" aria-hidden="true"></i>
</span>
<span>占用内存
<span class="badge badge-sm bg-dark" id="memory_data">
<i class="fa fa-spinner fa-spin" aria-hidden="true"></i>
</span>
</span>
</div>
<div class="progress progress-xs m-t-sm bg-default">
<div id="memory_css" class="progress-bar bg-danger" data-toggle="tooltip" style="width: 100%"></div>
</div>
<div class="">
<span class="pull-right text-danger" id="disk">
<i class="fa fa-spinner fa-spin" aria-hidden="true"></i>
</span>
<span>磁盘占用
<span class="badge badge-sm bg-dark" id="disk_data">
<i class="fa fa-spinner fa-spin" aria-hidden="true"></i>
</span>
</span>
</div>
<div class="progress progress-xs m-t-sm bg-default">
<div id="disk_css" class="progress-bar bg-danger" data-toggle="tooltip" style="width: 100%"></div>
</div>
<div class="">
<span class="pull-right text-danger" id="memCached">
<i class="fa fa-spinner fa-spin" aria-hidden="true"></i>
</span>
<span>内存缓存
<span class="badge badge-sm bg-dark" id="memCached_data">
<i class="fa fa-spinner fa-spin" aria-hidden="true"></i>
</span>
</span>
</div>
<div class="progress progress-xs m-t-sm bg-default">
<div id="memCached_css" class="progress-bar bg-danger" data-toggle="tooltip" style="width: 100%"></div>
</div>
<div class="">
<span class="pull-right text-danger" id="memBuffers">
<i class="fa fa-spinner fa-spin" aria-hidden="true"></i>
</span>
<span>内存缓冲
<span class="badge badge-sm bg-dark" id="memBuffers_data">
<i class="fa fa-spinner fa-spin" aria-hidden="true"></i>
</span>
</span>
</div>
<div class="progress progress-xs m-t-sm bg-default">
<div id="memBuffers_css" class="progress-bar bg-danger" data-toggle="tooltip" style="width: 100%"></div>
</div>
<div class="">
<span class="pull-right text-danger" id="state_s">
<i class="fa fa-spinner fa-spin" aria-hidden="true"></i>
</span>
<span>系统负载
<span id="state">
<span class="badge badge-sm bg-dark">
<i class="fa fa-spinner fa-spin" aria-hidden="true"></i>
</span>
</span>
</span>
</div>
<div class="progress progress-xs m-t-sm bg-default">
<div id="state_css" class="progress-bar bg-danger" data-toggle="tooltip" style="width: 100%"></div>
</div>
</div>
<div class="col-sm-4 b-l b-light visible-lg visible-md">
<div class="m-t-xs m-b-xs font-bold">网络状态</div>
<div class="">
<span class="pull-right text-default" id="io">
<i class="fa fa-spinner fa-spin" aria-hidden="true"></i>
</span>
<span>IO</span>
</div>
<br/>
<div class="">
<span class="pull-right text-default" id="io1">
<i class="fa fa-spinner fa-spin" aria-hidden="true"></i>
</span>
<span>实时IO</span>
</div>
<br/>
<div class="">
<span class="pull-right text-default" id="eth">
<i class="fa fa-spinner fa-spin" aria-hidden="true"></i>
</span>
<span>网络</span>
</div>
<br/>
<div class="">
<span class="pull-right text-default" id="eth1">
<i class="fa fa-spinner fa-spin" aria-hidden="true"></i>
</span>
<span>实时网络</span>
</div>
<br/>
<div class="">
<span class="pull-right text-default" id="time">
<i class="fa fa-spinner fa-spin" aria-hidden="true"></i>
</span>
<span>服务器时间</span>
</div>
<br/>
<div class="">
<span class="pull-right text-default">
<span class="badge badge-sm bg-dark"><?php echo $_SERVER['SERVER_SOFTWARE']; ?></span></span>
<span>WEB服务器</span>
</div>
<br/>
<div class="">
<span class="pull-right text-default">
<span class="badge badge-sm bg-dark"><?php echo $_SERVER['SERVER_PROTOCOL']; ?></span>
</span>
<span>通信协议</span>
</div>
<br/>
<div class="">
<span class="pull-right text-default">
<span class="badge badge-sm bg-dark"><?php echo PHP_VERSION;?></span>
</span>
<span>PHP版本</span>
</div>
<br/>
</div>
<div class="col-sm-4 b-l b-light visible-lg visible-md">
<div class="m-t-xs m-b-sm font-bold">访客信息</div>
<div class="">
<span class="pull-right text-default" id="u_time">
<i class="fa fa-spinner fa-spin" aria-hidden="true"></i>
</span>
<span>持续运行</span>
</div>
<br/>
<div class="">
<span class="pull-right text-default" id="ip">
<i class="fa fa-spinner fa-spin" aria-hidden="true"></i>
</span>
<span>您的IP</span>
</div>
<br/>
<div class="">
<span class="pull-right text-default" id="address">
<i class="fa fa-spinner fa-spin" aria-hidden="true"></i>
</span>
<span>网络地址</span>
</div>
<br/>
<div class="">
<span class="pull-right text-default" id="b">
<i class="fa fa-spinner fa-spin" aria-hidden="true"></i>
</span>
<span>浏览器信息</span>
</div>
<br/>
<div class="">
<span class="pull-right text-default" id="sys">
<i class="fa fa-spinner fa-spin" aria-hidden="true"></i>
</span>
<span>您的设备</span>
</div>
<br/>
<div class="">
<span class="pull-right text-default">
<span class="badge badge-sm bg-dark"><?php echo $_SERVER['REQUEST_METHOD'];?></span></span>
<span>请求方法</span>
</div>
<br/>
<div class="">
<span class="pull-right text-default">
<span class="badge badge-sm bg-dark"><?php echo $_SERVER['HTTP_ACCEPT_LANGUAGE'];?></span></span>
<span>服务语言</span>
</div>
<br/>
<div class="">
<span class="pull-right text-default" id="sys_times">
<i class="fa fa-spinner fa-spin" aria-hidden="true"></i>
</span>
<span>您的设备时间</span>
</div>
</div>
</div>
</div>
</li>
<!-- handsome主题-添加服务器状态栏 -->
主题设置 - 开发者设置 - 自定义输出body 尾部的HTML代码
展开查看详情
<!-- handsome主题-添加服务器状态栏 -->
<script>
var stateUrl = '/serverInfo.php';
var se_rx;
var se_tx;
var si_rx;
var si_tx;
function returnFloat(value){
return value.toFixed(2)+'%';
}
function floats(value){
return value.toFixed(2);
}
function getPercent(curNum, totalNum, isHasPercentStr) {
curNum = parseFloat(curNum);
totalNum = parseFloat(totalNum);
if (isNaN(curNum) || isNaN(totalNum)) {
return 'Error';
}
return isHasPercentStr ?
totalNum <= 0 ? '0%' : (Math.round(curNum / totalNum * 10000) / 100.00 + '%') :
totalNum <= 0 ? 0 : (Math.round(curNum / totalNum * 10000) / 100.00 + '%');
}
function getPercents(curNum, totalNum, isHasPercentStr) {
curNum = parseFloat(curNum);
totalNum = parseFloat(totalNum);
if (isNaN(curNum) || isNaN(totalNum)) {
return 'Error';
}
return isHasPercentStr ?
totalNum <= 0 ? '0%' : (Math.round(curNum / totalNum * 10000) / 100.00) :
totalNum <= 0 ? 0 : (Math.round(curNum / totalNum * 10000) / 100.00);
}
function setSize(value,d){
switch (d) {
case 'bit':
return bit = value*8;
break;
case 'bytes':
return value;
break;
case 'kb':
return value/1024;
break;
case 'mb':
return value/1024/1024;
break;
case 'gb':
return value/1024/1024/1024;
break;
case 'tb':
return value/1024/1024/1024/1024;
break;
}
}
function ForDight(Dight){
if (Dight < 0){
var Last = 0+"B/s";
}else if (Dight < 1024){
var Last = setSize(Dight,'bytes').toFixed(0)+"B/s";
}else if (Dight < 1048576){
var Last = floats(setSize(Dight,'kb'))+"K/s";
}else{
var Last = floats(setSize(Dight,'mb'))+"MB/s";
}
return Last;
}
function state(){
$.ajax({
url: stateUrl,
type: 'get',
dataType: 'json',
data: {
action:'fetch',
},
beforeSend:function(){
},
complete:function(){
},
error: function() {
},
success: function (data) {
var cpu = data.serverStatus.cpuUsage['user']+data.serverStatus.cpuUsage['nice']+data.serverStatus.cpuUsage['sys'];
$("#cpu").html(returnFloat(cpu));
$("#cpu_css").css("width",returnFloat(cpu));
$("#cpu_cores").html(data.serverStatus.cpuUsage['cores'] + "核心");
if(cpu<70){
$("#cpu_css").removeClass();
$("#cpu_css").addClass("progress-bar bg-success");
$("#cpu").removeClass();
$("#cpu").addClass("pull-right text-success");
}
if(cpu>=70){
$("#cpu_css").removeClass();
$("#cpu_css").addClass("progress-bar bg-warning");
$("#cpu").removeClass();
$("#cpu").addClass("pull-right text-warning");
}
if(cpu>=90){
$("#cpu_css").removeClass();
$("#cpu_css").addClass("progress-bar bg-danger");
$("#cpu").removeClass();
$("#cpu").addClass("pull-right text-danger");
}
var memory_value = data.serverStatus.memRealUsage['value'];
var memory_max = data.serverStatus.memRealUsage['max'];
$("#memory").html(getPercent(memory_value,memory_max,memory_value));
window.RemData = getPercents(memory_value,memory_max,memory_value);
$("#memory_css").css("width",getPercent(memory_value,memory_max,memory_value));
var me = getPercents(memory_value,memory_max,memory_value);
if(me<70){
$("#memory_css").removeClass();
$("#memory_css").addClass("progress-bar bg-success");
$("#memory").removeClass();
$("#memory").addClass("pull-right text-success");
}
if(me>=70){
$("#memory_css").removeClass();
$("#memory_css").addClass("progress-bar bg-warning");
$("#memory").removeClass();
$("#memory").addClass("pull-right text-warning");
}
if(me>=90){
$("#memory_css").removeClass();
$("#memory_css").addClass("progress-bar bg-danger");
$("#memory").removeClass();
$("#memory").addClass("pull-right text-danger");
}
if(floats(setSize(memory_value,'mb'))>1024){
var memory_data_value = floats(setSize(memory_value,'gb'))+"GB";
} else{
var memory_data_value = floats(setSize(memory_value,'mb'))+"MB";
}
if(floats(setSize(memory_max,'mb'))>1024){
var memory_data_max = floats(setSize(memory_max,'gb'))+"GB";
} else{
var memory_data_max = floats(setSize(memory_max,'mb'))+"MB";
}
$("#memory_data").html(memory_data_value+" / "+memory_data_max);
var disk_value = data.serverInfo.diskUsage['value'];
var disk_max = data.serverInfo.diskUsage['max'];
$("#disk").html(getPercent(disk_value,disk_max,disk_value));
$("#disk_css").css("width",getPercent(disk_value,disk_max,disk_value));
var dk = getPercents(disk_value,disk_max,disk_value);
if(dk<70){
$("#disk_css").removeClass();
$("#disk_css").addClass("progress-bar bg-success");
$("#disk").removeClass();
$("#disk").addClass("pull-right text-success");
}
if(dk>=70){
$("#disk_css").removeClass();
$("#disk_css").addClass("progress-bar bg-warning");
$("#disk").removeClass();
$("#disk").addClass("pull-right text-warning");
}
if(dk>=90){
$("#disk_css").removeClass();
$("#disk_css").addClass("progress-bar bg-danger");
$("#disk").removeClass();
$("#disk").addClass("pull-right text-danger");
}
if(floats(setSize(disk_value,'mb'))>1024){
var disk_data_value = floats(setSize(disk_value,'gb'))+"GB";
} else{
var disk_data_value = floats(setSize(disk_value,'mb'))+"MB";
}
if(floats(setSize(disk_max,'mb'))>1024){
var disk_data_max = floats(setSize(disk_max,'gb'))+"GB";
} else{
var disk_data_max = floats(setSize(disk_max,'mb'))+"MB";
}
$("#disk_data").html(disk_data_value+" / "+disk_data_max);
var memCached_value = data.serverStatus.memCached['value'];
var memCached_max = data.serverStatus.memCached['max'];
$("#memCached").html(getPercent(memCached_value,memCached_max,memCached_value));
$("#memCached_css").css("width",getPercent(memCached_value,memCached_max,memCached_value));
var mem = getPercents(memCached_value,memCached_max,memCached_value);
if(mem<70){
$("#memCached_css").removeClass();
$("#memCached_css").addClass("progress-bar bg-success");
$("#memCached").removeClass();
$("#memCached").addClass("pull-right text-success");
}
if(mem>=70){
$("#memCached_css").removeClass();
$("#memCached_css").addClass("progress-bar bg-warning");
$("#memCached").removeClass();
$("#memCached").addClass("pull-right text-warning");
}
if(mem>=90){
$("#memCached_css").removeClass();
$("#memCached_css").addClass("progress-bar bg-danger");
$("#memCached").removeClass();
$("#memCached").addClass("pull-right text-danger");
}
if(floats(setSize(memCached_value,'mb'))>1024){
var memCached_data_value = floats(setSize(memCached_value,'gb'))+"GB";
} else{
var memCached_data_value = floats(setSize(memCached_value,'mb'))+"MB";
}
if(floats(setSize(memCached_max,'mb'))>1024){
var memCached_data_max = floats(setSize(memCached_max,'gb'))+"GB";
} else{
var memCached_data_max = floats(setSize(memCached_max,'mb'))+"MB";
}
$("#memCached_data").html(memCached_data_value+" / "+memCached_data_max);
var memBuffers_value = data.serverStatus.memBuffers['value'];
var memBuffers_max = data.serverStatus.memBuffers['max'];
$("#memBuffers").html(getPercent(memBuffers_value,memBuffers_max,memBuffers_value));
$("#memBuffers_css").css("width",getPercent(memBuffers_value,memBuffers_max,memBuffers_value));
var memB = getPercents(memCached_value,memCached_max,memCached_value);
if(memB<70){
$("#memBuffers_css").removeClass();
$("#memBuffers_css").addClass("progress-bar bg-success");
$("#memBuffers").removeClass();
$("#memBuffers").addClass("pull-right text-success");
}
if(memB>=70){
$("#memBuffers_css").removeClass();
$("#memBuffers_css").addClass("progress-bar bg-warning");
$("#memBuffers").removeClass();
$("#memBuffers").addClass("pull-right text-warning");
}
if(memB>=90){
$("#memBuffers_css").removeClass();
$("#memBuffers_css").addClass("progress-bar bg-danger");
$("#memBuffers").removeClass();
$("#memBuffers").addClass("pull-right text-danger");
}
if(floats(setSize(memBuffers_value,'mb'))>1024){
var memBuffers_data_value = floats(setSize(memBuffers_value,'gb'))+"GB";
} else{
var memBuffers_data_value = floats(setSize(memBuffers_value,'mb'))+"MB";
}
if(floats(setSize(memBuffers_max,'mb'))>1024){
var memBuffers_data_max = floats(setSize(memBuffers_max,'gb'))+"GB";
} else{
var memBuffers_data_max = floats(setSize(memBuffers_max,'mb'))+"MB";
}
$("#memBuffers_data").html(memBuffers_data_value+" / "+memBuffers_data_max);
var state = "";
for(var i = 0; i < data.serverStatus.sysLoad.length ; i++){
state += '<span class="badge badge-sm bg-dark">'+data.serverStatus.sysLoad[i]+'</span> '
}
$("#state").html(state);
var state_s = getPercent(data.serverStatus.sysLoad[0],2,data.serverStatus.sysLoad[0]);
$("#state_css").css("width",state_s);
$("#state_s").html(state_s);
var sta = getPercents(data.serverStatus.sysLoad[0],2,data.serverStatus.sysLoad[0]);
if(sta<70){
$("#state_css").removeClass();
$("#state_css").addClass("progress-bar bg-success");
$("#state_s").removeClass();
$("#state_s").addClass("pull-right text-success");
}
if(sta>=70){
$("#state_css").removeClass();
$("#state_css").addClass("progress-bar bg-warning");
$("#state_s").removeClass();
$("#state_s").addClass("pull-right text-warning");
}
if(sta>=90){
$("#state_css").removeClass();
$("#state_css").addClass("progress-bar bg-danger");
$("#state_s").removeClass();
$("#state_s").addClass("pull-right text-danger");
}
$("#time").html('<span class="badge badge-sm bg-dark">'+data.serverInfo.serverTime+'</span>');
$("#u_time").html('<span class="badge badge-sm bg-dark">'+data.serverInfo.serverUptime["days"]+' 天'+data.serverInfo.serverUptime["hours"]+' 时 '+data.serverInfo.serverUptime["mins"]+' 分'+data.serverInfo.serverUptime["secs"]+' 秒</span>');
if(floats(setSize(data.networkStats.networks.eth0.tx,'mb'))>1024){
var aaa_tx = floats(setSize(data.networkStats.networks.eth0.tx,'gb'))+"GB";
} else{
var aaa_tx = floats(setSize(data.networkStats.networks.eth0.tx,'mb'))+"MB";
}
if(floats(setSize(data.networkStats.networks.eth0.rx,'mb'))>1024){
var aaa_rx = floats(setSize(data.networkStats.networks.eth0.rx,'gb'))+"GB";
} else{
var aaa_rx = floats(setSize(data.networkStats.networks.eth0.rx,'mb'))+"MB";
}
$("#eth").html('<span class="badge badge-sm bg-dark"><i class="glyphicon glyphicon-upload" aria-hidden="true"></i> '+aaa_tx+'</span> '+
'<span class="badge badge-sm bg-dark"><i class="glyphicon glyphicon-download" aria-hidden="true"></i> '+aaa_rx+'</span>');
$("#eth1").html('<span class="badge badge-sm bg-dark"><i class="glyphicon glyphicon-cloud-upload" aria-hidden="true"></i> '+ForDight(data.networkStats.networks.eth0.tx-se_tx,3)+'</span> '+
'<span class="badge badge-sm bg-dark"><i class="glyphicon glyphicon-cloud-download" aria-hidden="true"></i> '+ForDight(data.networkStats.networks.eth0.rx-se_rx,3)+'</span>');
se_tx = data.networkStats.networks.eth0.tx;
se_rx = data.networkStats.networks.eth0.rx;
if(floats(setSize(data.networkStats.networks.lo.tx,'mb'))>1024){
var lo_tx = floats(setSize(data.networkStats.networks.lo.tx,'gb'))+"GB";
} else{
var lo_tx = floats(setSize(data.networkStats.networks.lo.tx,'mb'))+"MB";
}
if(floats(setSize(data.networkStats.networks.lo.rx,'mb'))>1024){
var lo_rx = floats(setSize(data.networkStats.networks.lo.rx,'gb'))+"GB";
} else{
var lo_rx = floats(setSize(data.networkStats.networks.lo.rx,'mb'))+"MB";
}
$("#io").html('<span class="badge badge-sm bg-success"><i class="fa fa-upload" aria-hidden="true"></i> '+lo_tx+'</span> '+
'<span class="badge badge-sm bg-success"><i class="glyphicon glyphicon-cloud-download" aria-hidden="true"></i> '+lo_rx+'</span>');
$("#io1").html('<span class="badge badge-sm bg-dark"><i class="glyphicon glyphicon-cloud-upload" aria-hidden="true"></i> '+ForDight(data.networkStats.networks.lo.tx-si_tx,3)+'</span> '+
'<span class="badge badge-sm bg-dark"><i class="glyphicon glyphicon-cloud-download" aria-hidden="true"></i> '+ForDight(data.networkStats.networks.lo.rx-si_rx,3)+'</span>');
si_tx = data.networkStats.networks.lo.tx;
si_rx = data.networkStats.networks.lo.rx;
}
});
}
function getNowFormatDate(){
var date = new Date();
var seperator1 = "-";
var seperator2 = ":";
var month = date.getMonth() + 1;
var strDate = date.getDate();
if (month >= 1 && month <= 9) {
month = "0" + month;
}
if (strDate >= 0 && strDate <= 9) {
strDate = "0" + strDate;
}
var currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate
+ " " + date.getHours() + seperator2 + date.getMinutes()
+ seperator2 + date.getSeconds();
return currentdate;
}
function UserInfo(){
// 先根据UA设置设备和浏览器信息
var ua = navigator.userAgent;
var browserInfo = getBrowserInfo(ua);
var osInfo = getOsInfo(ua);
// 立即显示浏览器和系统信息(不依赖API)
$("#b").html('<span class="badge badge-sm bg-dark">'+browserInfo+'</span>');
$("#sys").html('<span class="badge badge-sm bg-dark">'+osInfo+'</span>');
// 使用我们自己的serverInfo.php获取IP信息,避免跨域问题
$.ajax({
type: "get",
url: stateUrl, // 使用之前已定义的stateUrl变量 (指向serverInfo.php)
data: {action: 'getip'},
async: true,
dataType: "json",
beforeSend: function(){
$("#ip").html('<span class="badge badge-sm bg-dark">获取中...</span>');
$("#address").html('<span class="badge badge-sm bg-dark">获取中...</span>');
},
error: function(){
$("#ip").html('<span class="badge badge-sm bg-dark">'+window.location.hostname+'</span>');
$("#address").html('<span class="badge badge-sm bg-dark">本地访问</span>');
},
success: function(data){
if(data && data.ip) {
$("#ip").html('<span class="badge badge-sm bg-dark">'+data.ip+'</span>');
if(data.location) {
$("#address").html('<span class="badge badge-sm bg-dark">'+data.location+'</span>');
} else {
$("#address").html('<span class="badge badge-sm bg-dark">本地网络</span>');
}
} else {
$("#ip").html('<span class="badge badge-sm bg-dark">'+window.location.hostname+'</span>');
$("#address").html('<span class="badge badge-sm bg-dark">本地访问</span>');
}
}
});
}
// 获取设备系统信息的函数
function getOsInfo(ua) {
if(!ua) ua = navigator.userAgent;
if (ua.indexOf("Windows NT 10.0") != -1) {
// 检测Win11
if (ua.indexOf("Windows NT 10.0; Win64") != -1 &&
((ua.indexOf("Chrome/") != -1 && parseInt(ua.split("Chrome/")[1]) >= 90) ||
(ua.indexOf("Firefox/") != -1 && parseInt(ua.split("Firefox/")[1]) >= 90))) {
return "Windows 11";
}
return "Windows 10";
}
if (ua.indexOf("Windows NT 6.3") != -1) return "Windows 8.1";
if (ua.indexOf("Windows NT 6.2") != -1) return "Windows 8";
if (ua.indexOf("Windows NT 6.1") != -1) return "Windows 7";
if (ua.indexOf("Windows NT 6.0") != -1) return "Windows Vista";
if (ua.indexOf("Windows NT 5.1") != -1) return "Windows XP";
if (ua.indexOf("Android") != -1) return "Android " + (ua.match(/Android [\d\.]+;/) ? ua.match(/Android [\d\.]+;/)[0].replace(";","").replace("Android ","") : "");
if (ua.indexOf("iPhone") != -1) return "iPhone";
if (ua.indexOf("iPad") != -1) return "iPad";
if (ua.indexOf("Mac OS X") != -1) return "macOS";
if (ua.indexOf("Linux") != -1) return "Linux";
if (ua.indexOf("CentOS") != -1) return "CentOS";
if (ua.indexOf("Ubuntu") != -1) return "Ubuntu";
return "未知设备";
}
// 获取浏览器信息
function getBrowserInfo(ua) {
if(!ua) ua = navigator.userAgent;
// Edge
if (ua.indexOf("Edg/") > -1) {
return "Edge " + ua.match(/Edg\/([\d.]+)/)[1].split('.')[0];
}
// Chrome
else if (ua.indexOf("Chrome/") > -1 && ua.indexOf("Safari/") > -1 && ua.indexOf("OPR/") == -1) {
return "Chrome " + ua.match(/Chrome\/([\d.]+)/)[1].split('.')[0];
}
// Firefox
else if (ua.indexOf("Firefox/") > -1) {
return "Firefox " + ua.match(/Firefox\/([\d.]+)/)[1].split('.')[0];
}
// Opera
else if (ua.indexOf("OPR/") > -1 || ua.indexOf("Opera/") > -1) {
return "Opera " + (ua.match(/OPR\/([\d.]+)/) || ua.match(/Opera\/([\d.]+)/))[1].split('.')[0];
}
// Safari
else if (ua.indexOf("Safari/") > -1 && ua.indexOf("Chrome/") == -1) {
return "Safari " + (ua.match(/Version\/([\d.]+)/) ? ua.match(/Version\/([\d.]+)/)[1].split('.')[0] : "");
}
// 其他浏览器
else {
return "浏览器 " + (navigator.appVersion ? navigator.appVersion.split(" ")[0] : "");
}
}
$('#StateData').click(function(){
clearInterval(window.getnet);
clearInterval(window.info);
window.getnet = setInterval(function(){
if($('#StateDataPos').is('.open')){
state();
$("#sys_times").html('<span class="badge badge-sm bg-dark">'+getNowFormatDate()+'</span>');
}
},1000);
UserInfo();
});
</script>
<!-- handsome主题-添加服务器状态栏 -->
上述修改完毕之后,在网站的根目录新建 serverInfo.php 文件
展开查看详情
<?php
/**
* 获取当前Unix时间戳
* */
$unixTimestamp = time();
/**
* 获取服务器总的运行时长
* */
$serverUptime = getUpTime();
/**
* 获取服务器负载 以及CPU使用信息
* */
$serverLoad = GetLoad();
$cpuUsage = GetCPUInfo();
/**
* 获取服务器内存信息
* */
$memoryInfo = GetMem();
// 处理IP信息请求
if(isset($_GET['action']) && $_GET['action'] == 'getip') {
// 获取用户真实IP地址
$ip = '';
if(!empty($_SERVER['HTTP_CLIENT_IP'])){
$ip = $_SERVER['HTTP_CLIENT_IP'];
}elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
$ip = $_SERVER['REMOTE_ADDR'];
}
// 简单过滤掉非法IP
$ip = filter_var($ip, FILTER_VALIDATE_IP) ? $ip : '未知';
// 获取地理位置信息(只对公网IP有效)
$location = '';
// 检查是否是内网IP
if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
$location = '内网IP';
} else {
// 方法1:使用太平洋IP库(覆盖较全面,国内外都支持)
$url = "http://whois.pconline.com.cn/ipJson.jsp?ip={$ip}&json=true";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36');
curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate');
$response = curl_exec($ch);
$errno = curl_errno($ch);
curl_close($ch);
if($response && !$errno) {
// 太平洋的接口返回的是GB2312编码,需要转换
$response = mb_convert_encoding($response, 'UTF-8', 'GBK');
$data = json_decode($response, true);
if($data && isset($data['pro']) && isset($data['city'])) {
$region = '';
if(!empty($data['pro'])) {
$region .= $data['pro'];
}
if(!empty($data['city']) && $data['city'] != $data['pro']) {
$region .= ' ' . $data['city'];
}
// 根据IP段判断运营商
$carrier = judgeCarrier($ip);
if($carrier) {
$region .= ' ' . $carrier;
}
$location = $region ? $region : '未知区域';
}
}
// 方法2:使用IpInfo API(国外IP支持较好)
if(empty($location)) {
$url = "https://ipinfo.io/{$ip}/json";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36');
$response = curl_exec($ch);
curl_close($ch);
if($response) {
$data = json_decode($response, true);
if($data && isset($data['region']) && isset($data['city'])) {
$region = '';
if(!empty($data['country'])) {
$region .= getCountryName($data['country']);
}
if(!empty($data['region'])) {
$region .= ' ' . $data['region'];
}
if(!empty($data['city'])) {
$region .= ' ' . $data['city'];
}
if(!empty($data['org'])) {
$region .= ' ' . preg_replace('/^AS\d+\s+/', '', $data['org']);
} else {
// 补充运营商信息
$carrier = judgeCarrier($ip);
if($carrier) {
$region .= ' ' . $carrier;
}
}
$location = $region ? $region : '未知区域';
}
}
}
// 方法3:使用IPIP.net的免费接口(国内移动网络支持较好)
if(empty($location)) {
$url = "https://freeapi.ipip.net/{$ip}";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36');
$response = curl_exec($ch);
curl_close($ch);
if($response && $response != '{}') {
$data = json_decode($response, true);
if(is_array($data) && count($data) >= 4) {
// IPIP.net返回格式:["中国","福建","厦门","","移动"]
$region = '';
if(!empty($data[1])) {
$region .= $data[1]; // 省份
}
if(!empty($data[2]) && $data[2] != $data[1]) {
$region .= ' ' . $data[2]; // 城市
}
if(!empty($data[4])) {
$region .= ' ' . $data[4]; // 运营商
} else {
// 补充运营商信息
$carrier = judgeCarrier($ip);
if($carrier) {
$region .= ' ' . $carrier;
}
}
$location = $region ? $region : '未知区域';
}
}
}
// 方法4:使用淘宝IP库(作为备用)
if(empty($location)) {
$url = "https://ip.taobao.com/outGetIpInfo?ip=".$ip."&accessKey=alibaba-inc";
$opts = array(
'http' => array(
'method' => "GET",
'timeout' => 3,
)
);
$context = stream_context_create($opts);
$response = @file_get_contents($url, false, $context);
if($response !== false) {
$data = json_decode($response, true);
if(isset($data['data']) && $data['data']) {
$result = $data['data'];
$region = '';
if(!empty($result['region'])) {
$region .= $result['region'];
}
if(!empty($result['city']) && $result['city'] != $result['region']) {
$region .= ' ' . $result['city'];
}
if(!empty($result['isp'])) {
$region .= ' ' . $result['isp'];
} else {
// 补充运营商信息
$carrier = judgeCarrier($ip);
if($carrier) {
$region .= ' ' . $carrier;
}
}
$location = $region ? $region : '未知区域';
}
}
}
// 方法5:极速数据网络IP库(移动网络特别友好)
if(empty($location)) {
$url = "http://ip.jisuapi.com/api/ip/geo?ip={$ip}";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$response = curl_exec($ch);
curl_close($ch);
if($response) {
$data = json_decode($response, true);
if(isset($data['result']) && $data['result']) {
$result = $data['result'];
$region = '';
if(!empty($result['province'])) {
$region .= $result['province'];
}
if(!empty($result['city']) && $result['city'] != $result['province']) {
$region .= ' ' . $result['city'];
}
if(!empty($result['isp'])) {
$region .= ' ' . $result['isp'];
} else {
// 补充运营商信息
$carrier = judgeCarrier($ip);
if($carrier) {
$region .= ' ' . $carrier;
}
}
$location = $region ? $region : '未知区域';
}
}
}
// 方法6:仅使用IP段进行精准匹配(最后保障)
if(empty($location)) {
// 根据IP段匹配位置信息
$ipLocation = getIpLocation($ip);
if($ipLocation) {
$location = $ipLocation;
} else {
// 至少返回运营商信息
$carrier = judgeCarrier($ip);
if($carrier) {
$location = $carrier;
} else {
$location = "公网IP";
}
}
}
}
// 返回IP信息
echo json_encode(['ip' => $ip, 'location' => $location]);
exit;
}
/**
* 根据IP地址判断归属运营商
* @param string $ip IP地址
* @return string 运营商名称
*/
function judgeCarrier($ip) {
// 特殊IP段映射
$special_ip_carriers = [
// 移动特殊段
'39.128.' => '中国移动', '39.129.' => '中国移动', '39.130.' => '中国移动', '39.131.' => '中国移动',
'39.132.' => '中国移动', '39.133.' => '中国移动', '39.134.' => '中国移动', '39.135.' => '中国移动',
'39.136.' => '中国移动', '39.137.' => '中国移动', '39.138.' => '中国移动', '39.139.' => '中国移动',
'39.140.' => '中国移动', '39.141.' => '中国移动', '39.142.' => '中国移动', '39.143.' => '中国移动',
'39.144.' => '中国移动', '39.145.' => '中国移动', '39.146.' => '中国移动', '39.147.' => '中国移动',
'39.148.' => '中国移动', '39.149.' => '中国移动', '39.150.' => '中国移动', '39.151.' => '中国移动',
'39.152.' => '中国移动', '39.153.' => '中国移动', '39.154.' => '中国移动', '39.155.' => '中国移动',
'39.156.' => '中国移动', '39.157.' => '中国移动', '39.158.' => '中国移动', '39.159.' => '中国移动',
'39.176.' => '中国移动',
'40.128.' => '中国移动', '40.129.' => '中国移动', '40.130.' => '中国移动',
'41.128.' => '中国移动', '42.128.' => '中国移动', '43.128.' => '中国移动',
// 联通特殊段
'44.128.' => '中国联通', '45.128.' => '中国联通', '46.128.' => '中国联通',
// 电信特殊段
'48.128.' => '中国电信', '49.128.' => '中国电信', '50.128.' => '中国电信', '51.128.' => '中国电信',
];
// 检查特殊IP段映射
foreach ($special_ip_carriers as $prefix => $carrier) {
if (strpos($ip, $prefix) === 0) {
return $carrier;
}
}
// 移动
$china_mobile = [
'39', '40', '41', '42', '43', // 新的移动段
'47.0', '47.1', '47.2', '47.3', // 兼容部分联通和移动混用
'178.', '180.', '182.', '183.', '184.', '157.', '158.', '159.', '165.', '172.',
'120.204.', '120.205.', '120.206.', '120.207.', '120.208.', '120.209.',
'120.210.', '120.211.', '120.212.', '120.213.', '120.214.', '120.215.',
'221.130.', '221.131.', '221.132.', '221.133.', '221.134.', '221.135.',
'221.136.', '221.137.', '221.138.', '221.139.', '211.103.', '211.137.',
];
// 联通
$china_unicom = [
'44', '45', '46', // 新的联通段
'47.4', '47.5', '47.6', '47.7', '47.8', '47.9', // 兼容部分联通和移动混用
'130.', '131.', '132.', '155.', '156.', '186.', '145.', '146.', '166.', '175.',
'171.', '175.', '176.', '185.', '186.', '166.',
'120.64.', '120.65.', '120.66.', '120.67.', '120.68.', '120.69.',
'120.70.', '120.71.', '120.72.', '120.73.', '120.74.', '120.75.',
'120.76.', '120.77.', '120.78.', '120.79.', '120.80.', '120.81.',
'121.76.', '121.77.', '121.78.', '121.79.', '121.80.', '121.81.',
'218.100.', '218.104.', '218.108.', '211.90.', '211.91.', '211.92.',
'211.93.', '211.94.', '211.95.', '211.96.', '211.97.', '211.98.',
'211.99.', '211.100.', '211.101.', '211.102.',
];
// 电信
$china_telecom = [
'48', '49', '50', '51', // 新的电信段
'133.', '153.', '173.', '177.', '180.', '181.', '189.', '199.',
'120.128.', '120.129.', '120.130.', '120.131.', '120.132.', '120.133.',
'120.134.', '120.135.', '120.136.', '120.137.', '120.138.', '120.139.',
'120.140.', '120.141.', '120.142.', '120.143.', '120.144.', '120.145.',
'113.64.', '113.65.', '113.66.', '113.67.', '113.68.', '113.69.',
'113.70.', '113.71.', '113.72.', '113.73.', '113.74.', '113.75.',
'125.64.', '125.65.', '125.66.', '125.67.', '125.68.', '125.69.',
'125.70.', '125.71.', '125.72.', '125.73.', '125.74.', '125.75.',
'210.5.', '210.12.', '210.14.', '210.21.', '210.32.', '210.51.',
'210.52.', '210.77.', '210.192.',
];
// 铁通/广电/其他
$china_other = [
'36', '37', '38', // 其他杂段
'1700', '1705', '1709', // 虚拟运营商
];
// 特定省份IP段
$province_ip_map = [
// 河南移动IP段范围
'39.144.25' => '河南 南阳 中国移动',
'39.144.26' => '河南 南阳 中国移动',
'39.144.27' => '河南 南阳 中国移动',
// 福建电信IP段范围
'120.32.2' => '福建 厦门 中国电信',
'120.32.3' => '福建 厦门 中国电信',
'120.32.4' => '福建 厦门 中国电信',
];
// 检查特定省份IP段映射
foreach ($province_ip_map as $prefix => $location) {
if (strpos($ip, $prefix) === 0) {
return $location;
}
}
foreach ($china_mobile as $prefix) {
if (strpos($ip, $prefix) === 0) {
return '中国移动';
}
}
foreach ($china_unicom as $prefix) {
if (strpos($ip, $prefix) === 0) {
return '中国联通';
}
}
foreach ($china_telecom as $prefix) {
if (strpos($ip, $prefix) === 0) {
return '中国电信';
}
}
foreach ($china_other as $prefix) {
if (strpos($ip, $prefix) === 0) {
return '其他运营商';
}
}
return '';
}
/**
* 根据IP前缀识别地理位置
* @param string $ip IP地址
* @return string 地理位置
*/
function getIpLocation($ip) {
// 特定地区IP段映射表
$ip_location_map = [
// 河南移动
'39.144.2' => '河南 中国移动',
'39.144.25' => '河南 南阳 中国移动',
'39.144.26' => '河南 南阳 中国移动',
// 福建电信
'120.32.2' => '福建 厦门 中国电信',
'120.32.3' => '福建 厦门 中国电信',
// 北京联通
'111.200.' => '北京 中国联通',
'111.201.' => '北京 中国联通',
// 上海电信
'180.166.' => '上海 中国电信',
'180.167.' => '上海 中国电信',
// 广东移动
'120.231.' => '广东 中国移动',
'120.232.' => '广东 中国移动',
// 浙江电信
'115.192.' => '浙江 杭州 中国电信',
'115.193.' => '浙江 杭州 中国电信',
];
// 逐段检查,从最长前缀到最短
$segments = explode('.', $ip);
// 检查前三段 (如 192.168.1)
if(count($segments) >= 3) {
$prefix3 = $segments[0].'.'.$segments[1].'.'.$segments[2];
if(isset($ip_location_map[$prefix3])) {
return $ip_location_map[$prefix3];
}
}
// 检查前两段 (如 192.168)
if(count($segments) >= 2) {
$prefix2 = $segments[0].'.'.$segments[1];
if(isset($ip_location_map[$prefix2])) {
return $ip_location_map[$prefix2];
}
}
// 检查第一段 (如 192)
if(count($segments) >= 1) {
$prefix1 = $segments[0];
if(isset($ip_location_map[$prefix1])) {
return $ip_location_map[$prefix1];
}
}
return '';
}
/**
* 获取国家名称(将ISO代码转为中文名称)
* @param string $code 国家代码
* @return string 国家名称
*/
function getCountryName($code) {
$countries = [
'CN' => '中国', 'US' => '美国', 'JP' => '日本', 'KR' => '韩国',
'GB' => '英国', 'DE' => '德国', 'FR' => '法国', 'RU' => '俄罗斯',
'CA' => '加拿大', 'AU' => '澳大利亚', 'HK' => '香港', 'TW' => '台湾',
];
return isset($countries[$code]) ? $countries[$code] : $code;
}
// 定义要输出的内容
$serverInfo = array(
'serverTime' => date('Y-m-d H:i:s', $unixTimestamp),
'serverUptime' => array(
'days' => $serverUptime['days'],
'hours' => $serverUptime['hours'],
'mins' => $serverUptime['mins'],
'secs' => $serverUptime['secs']
),
'serverUtcTime' => date('Y/m/d H:i:s', $unixTimestamp),
'diskUsage' => array(
'value' => disk_total_space(__FILE__) - disk_free_space(__FILE__),
'max' => disk_total_space(__FILE__)
)
);
$serverStatus = array(
'sysLoad' => array($serverLoad['1m'], $serverLoad['5m'], $serverLoad['15m']),
'cpuUsage' => array(
'user' => $cpuUsage['user'],
'nice' => $cpuUsage['nice'],
'sys' => $cpuUsage['sys'],
'idle' => $cpuUsage['idle'],
'cores' => $cpuUsage['cores']
),
'memRealUsage' => array(
'value' => $memoryInfo['mRealUsed'],
'max' => $memoryInfo['mTotal']
),
'memBuffers' => array(
'value' => $memoryInfo['mBuffers'],
'max' => $memoryInfo['mTotal']
),
'memCached' => array(
'value' => $memoryInfo['mCached'],
'max' => $memoryInfo['mTotal']
),
'swapUsage' => array(
'value' => $memoryInfo['swapUsed'],
'max' => $memoryInfo['swapTotal']
),
'swapCached' => array(
'value' => $memoryInfo['swapCached'],
'max' => $memoryInfo['swapTotal']
)
);
$networkStats = array(
'networks' => GetNetwork()
);
// 将以上内容合并为一个数组
$output = array(
'serverInfo' => $serverInfo,
'serverStatus' => $serverStatus,
'networkStats' => $networkStats
);
// 将数组转换为JSON字符串并输出
echo json_encode($output);
/**
* 获取系统运行时长
*
* @return array
*/
function getUpTime() {
$uptime = (float) @file_get_contents("/proc/uptime");
$days = floor($uptime / 86400);
$hours = floor(($uptime % 86400) / 3600);
$minutes = floor((($uptime % 86400) % 3600) / 60);
$seconds = ($uptime % 3600) % 60;
//$time = $days.":".$hours.":".$minutes.":".$seconds;
return array(
'days' => $days,
'hours' => $hours,
'mins' => $minutes,
'secs' => $seconds
);
}
/**
* 获取系统负载
*
* @return array|false|string[]
*/
function GetLoad()
{
if (false === ($str = file_get_contents("/proc/loadavg")))
return [];
$loads = explode(' ', $str);
if ($loads)
{
return [
'1m' => $loads[0],
'5m' => $loads[1],
'15m' => $loads[2],
];
}
return [];
}
function GetCPUInfo()
{
$load = sys_getloadavg();
$user = $load[0];
$nice = $load[1];
$sys = $load[2];
$idle = 100 - ($user + $nice + $sys);
// 获取CPU核心数 - 多种方法尝试
$cores = 1; // 默认值
// 方法1:通过/proc/cpuinfo
if (file_exists('/proc/cpuinfo')) {
$cpuInfo = file_get_contents('/proc/cpuinfo');
$cores = substr_count($cpuInfo, 'processor');
}
// 方法2:通过sys_getloadavg
if ($cores == 0) {
$load = sys_getloadavg();
$cores = max(1, ceil($load[0])); // 至少1个核心
}
// 方法3:通过PHP函数
if ($cores == 0 && function_exists('shell_exec')) {
$cores = (int)shell_exec('nproc');
}
// 确保至少返回1个核心
$cores = max(1, $cores);
return [
'user' => $user,
'nice' => $nice,
'sys' => $sys,
'idle' => $idle,
'cores' => $cores
];
}
/**
* 内存信息
*
* @param bool $bFormat 格式化
*
* @return array
*/
function GetMem(bool $bFormat = false)
{
if (false === ($str = file_get_contents("/proc/meminfo")))
return [];
preg_match_all("/MemTotal\s{0,}\:+\s{0,}([\d\.]+).+?MemFree\s{0,}\:+\s{0,}([\d\.]+).+?Cached\s{0,}\:+\s{0,}([\d\.]+).+?SwapTotal\s{0,}\:+\s{0,}([\d\.]+).+?SwapFree\s{0,}\:+\s{0,}([\d\.]+)/s", $str, $mems);
preg_match_all("/Buffers\s{0,}\:+\s{0,}([\d\.]+)/s", $str, $buffers);
$mtotal = $mems[1][0] * 1024;
$mfree = $mems[2][0] * 1024;
$mbuffers = $buffers[1][0] * 1024;
$mcached = $mems[3][0] * 1024;
$stotal = $mems[4][0] * 1024;
$sfree = $mems[5][0] * 1024;
$mused = $mtotal - $mfree;
$sused = $stotal - $sfree;
$mrealused = $mtotal - $mfree - $mcached - $mbuffers; //真实内存使用
$rtn['mTotal'] = !$bFormat ? $mtotal : $this->size_format($mtotal, 1);
$rtn['mFree'] = !$bFormat ? $mfree : $this->size_format($mfree, 1);
$rtn['mBuffers'] = !$bFormat ? $mbuffers : $this->size_format($mbuffers, 1);
$rtn['mCached'] = !$bFormat ? $mcached : $this->size_format($mcached, 1);
$rtn['mUsed'] = !$bFormat ? ($mtotal - $mfree) : $this->size_format($mtotal - $mfree, 1);
$rtn['mPercent'] = (floatval($mtotal) != 0) ? round($mused / $mtotal * 100, 1) : 0;
$rtn['mRealUsed'] = !$bFormat ? $mrealused : $this->size_format($mrealused, 1);
$rtn['mRealFree'] = !$bFormat ? ($mtotal - $mrealused) : $this->size_format($mtotal - $mrealused, 1);//真实空闲
$rtn['mRealPercent'] = (floatval($mtotal) != 0) ? round($mrealused / $mtotal * 100, 1) : 0; //真实内存使用率
$rtn['mCachedPercent'] = (floatval($mcached) != 0) ? round($mcached / $mtotal * 100, 1) : 0; //Cached内存使用率
$rtn['swapTotal'] = !$bFormat ? $stotal : $this->size_format($stotal, 1);
$rtn['swapFree'] = !$bFormat ? $sfree : $this->size_format($sfree, 1);
$rtn['swapUsed'] = !$bFormat ? $sused : $this->size_format($sused, 1);
$rtn['swapPercent'] = (floatval($stotal) != 0) ? round($sused / $stotal * 100, 1) : 0;
$rtn['swapCached'] = $mbuffers;
return $rtn;
}
/**
* 获取网络数据
*
* @param bool $bFormat
*
* @return array
*/
function GetNetwork(bool $bFormat = false)
{
$rtn = [];
$netstat = file_get_contents('/proc/net/dev');
if (false === $netstat)
{
return [];
}
$bufe = preg_split("/\n/", $netstat, -1, PREG_SPLIT_NO_EMPTY);
foreach ($bufe as $buf)
{
if (preg_match('/:/', $buf))
{
list($dev_name, $stats_list) = preg_split('/:/', $buf, 2);
$dev_name = trim($dev_name);
$stats = preg_split('/\s+/', trim($stats_list));
$rtn[$dev_name]['name'] = $dev_name;
$rtn[$dev_name]['rx'] = !$bFormat ? $stats[0] : $this->netSize($stats[0]);
$rtn[$dev_name]['in_packets'] = $stats[1];
$rtn[$dev_name]['in_errors'] = $stats[2];
$rtn[$dev_name]['in_drop'] = $stats[3];
$rtn[$dev_name]['tx'] = !$bFormat ? $stats[8] : $this->netSize($stats[8]);
$rtn[$dev_name]['out_packets'] = $stats[9];
$rtn[$dev_name]['out_errors'] = $stats[10];
$rtn[$dev_name]['out_drop'] = $stats[11];
}
}
return $rtn;
}