现在的位置: 首页 > 综合 > 正文

php 系统监控

2018年05月21日 ⁄ 综合 ⁄ 共 3631字 ⁄ 字号 评论关闭

系统监控,在我的理解,就是cpu使用率,内存使用,硬盘使用,进程等等情况。

    而这些东西,对于很多科班的童鞋来说,应该都很简单。在命令行中输入几个命令就完事了。但是用php如何去做呢?这个问题,我想了很久,最后无意中在网上找到了几个可以执行外部命令的函数,顿时让我十分的惊喜。

    1.exec().            shell_exec() 相似,不同之处是它返回输出的最后一行,并且可选地用命令的完整输出和错误代码填充数组.exec($command,$array)  $array 为结果

    2.shell_exec     等同于``(单撇号)  执行命令,返回结果为字符串。

    3.passthru()     直接将结果输出到浏览器上 ,不返回任何值。

    4.system()         直接将结果输出到浏览器上,执行成功返回true,失败返回false

    知道了这几个函数,那就很简单了,基本的思路就是取到shell命令的结果,再用正则取到我们想要的值。

<?php
    header("Content-type: text/html; charset=utf-8");
    //CPU使用率
    $str = shell_exec('more /proc/stat');
    $pattern = "/(cpu[0-9]?)[\s]+([0-9]+)[\s]+([0-9]+)[\s]+([0-9]+)[\s]+([0-9]+)[\s]+([0-9]+)[\s]+([0-9]+)[\s]+([0-9]+)/";
    preg_match_all($pattern, $str, $out);
    echo "CPU使用率:".'<br>';
    echo "共有".(count($out[1])-1)."个CPU,每个CPU利用率如下:<br>";
    for($n=1;$n<count($out[1]);$n++)
    {
        echo $out[1][$n]."=".number_format((100*($out[1][$n]+$out[2][$n]+$out[3][$n])/($out[4][$n]+$out[5][$n]+$out[6][$n]+$out[7][$n])),4,'.','')."%<br>";
    }
    

    
    echo "***************************************************************".'<br>';

    
    //内存使用情况
    $str = shell_exec('more /proc/meminfo');
    $pattern = "/(.+):\s*([0-9]+)/";
    preg_match_all($pattern, $str, $out);
    $mem=getRealSize($out[2][0]);
    $used=getRealSize($out[2][1]);
    $useable=getRealSize(($out[2][0]-$out[2][1]));
    
    echo "内存使用情况:".'<br>';
    echo "物理内存总量:".$mem."<br>";
    echo "已使用的内存:".$useable."<br>";
    echo "可使用内存:".$used."<br>";
    echo "***************************************************************".'<br>';
    //计算内存大小
    function getRealSize($size)
    {
        $mb = 1024;         // MB
        $gb = 1024 * $mb;   // GB
        $tb = 1024 * $gb;   // TB
       
       
        if($size < $mb){
            return $size." KB";
        }else if($size < $gb){
            return round($size/$mb,2)." MB";
        }else if($size < $tb){
            return round($size/$gb,2)." GB";
        }else{
            return round($size/$tb,2)." TB";
        }
    }
    
    //硬盘使用情况
    $str = shell_exec('df -h');
    #var_dump($str);
    $arr = preg_split('/[,\s]+/', trim($str));
    $arr = array_slice($arr,7);
    #var_dump($arr);
    $arr = array_chunk($arr,6);
    #var_dump($arr);
    echo "硬盘各个分区使用情况如下:";
    #var_dump($arr);
    
?>
<table>
  <tr>
    <td>文件系统</td>
    <td>容量</td>
    <td>已用</td>
    <td>可用</td>
    <td>已用百分比</td>
    <td>挂载点</td>
  </tr>
  <?php
      foreach($arr as $v){
          echo "<tr>";
          
          for($i=0;$i<count($v);$i++){
              echo "<td>".$v[$i]."</td>";
          }
          
          echo "</tr>";
      }
      
  ?>
</table>

<?php
    echo "***************************************************************".'<br>';
    //指定进程运行个数
    echo "我们假设指定进程为httpd".'<br>';
    $http = shell_exec("ps ax|grep 'httpd' -c");
    #shell_exec("ps axu|grep 'httpd'|wc -l");
    if($http>2){
        echo "Httpd进程的运行个数为:".($http-2).'<br>';

//这里减去2的意思,是因为浏览器运行的时候,开启了一个,shell命令执行的时候,开启了一个。额,我是这么理解的,不知道对不对
    }else{
        echo "Httpd进程的运行个数为:0<br>";
    }
    echo "***************************************************************".'<br>';
?>

<?php
    //Mysql连接数
    $mysql_conn = shell_exec("/usr/local/lamp/mysql/bin/mysqladmin -uroot -phexinroot processlist");
    $str= str_replace(array("-","+"),"",$mysql_conn);
    $arr=explode('|',$str);
    //格式如下:
    /*array(19) { [0]=> string(1) " " [1]=> string(4) " Id " [2]=> string(6) " User " [3]=> string(11) " Host "
    [4]=> string(4) " db " [5]=> string(9) " Command " [6]=> string(6) " Time " [7]=> string(7) " State "
    [8]=> string(18) " Info " [9]=> string(2) " " [10]=> string(4) " 89 " [11]=> string(6) " root "
    [12]=> string(11) " localhost " [13]=> string(4) " " [14]=> string(9) " Query " [15]=> string(6) " 0 "
    [16]=> string(7) " " [17]=> string(18) " show processlist " [18]=> string(2) " " }
    var_dump($arr);
    */
    //经计算得到下式、
    if(count($arr)>10){
        $num=ceil((count($arr)-10)/9);
    }else{
        $num=0;
    }
    echo "当前Mysql的连接数为:".$num;

?>

抱歉!评论已关闭.