最近无聊在项目中做了一个关于服务器运行时间的展示,用PHP写的,整个程序写完运行了几个月都没有毛病,但是今天早上打开发现报错,经过检查原来是Linux服务器执行“uptime”后,在天数大于1和天数小于1时的数据格式不一样引起的。
附上源码:
- $arRuntime =explode(",", exec('uptime'));
- if(stripos($arRuntime[0],"day") === false){
- //$arRuntime[0] = "10:01:01 up 19:29"
- $run_days = 0;
- $temp_times = explode(" ", $arRuntime[0]);
- $run_time = explode(":",$temp_times[3]);
- }else{
- //$arRuntime[0] = "10:01:01 up 1 days" $arRuntime[1] = "19:29"
- $temp_days = explode(" ", $arRuntime[0]);
- $run_time = explode(":", $arRuntime[1]);
- $run_days = $temp_days[3];
- }
- $runtime = $run_days."天".$run_time[0]."小时".$run_time[1]."分钟";
- echo $runtime;
其实这个小代码不复杂,只是因为昨天重启服务器导致天数小于1,为了避免再次踩坑,所以在此做个笔记,需要的朋友也可以直接拿走。
2018年5月4日更新上述代码第二行中“days”改成“day”,因为天数为1的时候,返回数据是“1 day”只有天数大于1的时候比如2天,返回数据才是“2 days”。Linux写uptime的人也是好坑啊!
源码二:(这个源码是从LinuxIDC上面看到的,也收藏下)
- private function sys_linux()
- {
- if (false === ($str = @file("/proc/uptime"))) return false;
- $str = explode(" ", implode("", $str));
- $str = trim($str[0]);
- $min = $str / 60;
- $hours = $min / 60;
- $days = floor($hours / 24);
- $hours = floor($hours - ($days * 24));
- $min = floor($min - ($days * 60 * 24) - ($hours * 60));
- if ($days !== 0) $res['uptime'] = $days."天";
- if ($hours !== 0) $res['uptime'] .= $hours."小时";
- $res['uptime'] .= $min."分钟";
- return$res;
- }
用的时候只需要两行:
- $sysInfo = $this->sys_linux();
- $runtime = $sysInfo['uptime'];