首页 > Linux > 使用php分析linux目录大小

使用php分析linux目录大小

平时喜欢使用linux命令来管理远程服务器,通常一条语句或是一个shell脚本就能搞定所有的事情,但是一旦涉及到数据库和web,shell命令就鞭长莫及了。例如,我们需要监控linux服务器各大目录的大小并存储到数据库中,使用php性能不一定高,而且大目录下检测耗时长。于是,打算使用shell命令生成目录的日志,然后php进行读取分析。主要耗时全在shell命令上,使用crontab由root用户执行,将各大目录的大写写入到www用户的目录下,然后通过php进行分析呈现给web用户,不会造成权限混乱的问题。

第一步:编写shell命令,加入到定时任务中。例如每小时扫描一次:

00 * * * * root du -h --max-depth=1 /home/sda1/pic1 > /www/pic1.log

确保/www/pic1.log文件可读写,然后编写php代码进行数据分析:

<?php
$pic1 = file('pic1.log');

$pattern = '/(\d+[KMG])\s+(\S*)/';
$result = array();
$size_arr = array();
foreach($pic1 as $row)
{
	$matches = array();
	preg_match($pattern, $row, $matches);
	if(isset($matches[1]) && isset($matches[2]))
	{
		$size = StringSizeToBytes($matches[1]);
		$human = tosize($size);
		$dirpath = trim($matches[2]);
		$result[] = array('size' => $size, 'dirpath' => $dirpath, 'human' => $human);
		$size_arr[] = $size;
	}
}

//按照size进行排序
array_multisort($result, SORT_DESC, $size_arr);
var_dump($result);

//将linux统计的目录大小转化为字节数
function StringSizeToBytes($human){
  
    $unit = strtolower($human);
    $unit = preg_replace('/[^a-z]/', '', $unit);
    $value = intval(preg_replace('/[^0-9]/', '', $human));
	
    $units = array('b'=>0, 'k'=>1, 'kb'=>1, 'm'=>2, 'mb'=>2, 'g'=>3, 'gb'=>3, 't'=>4, 'tb'=>4);
	
    $exponent = isset($units[$unit]) ? $units[$unit] : 0;
	
    return ($value * pow(1024, $exponent));           
}

/**
 * 格式化字节数为可读数据大小
 * @param int $bytes
 * @return string
 */
function tosize($bytes)                          //自定义一个文件大小单位转换函数
{
	if ($bytes >= pow(2,40))                            //如果提供的字节数大于等于2的40次方,则条件成立
	{
		$return = round($bytes / pow(1024,4), 2);       //将字节大小转换为同等的T大小
		$suffix = 'TB';                                 //单位为TB
	} elseif ($bytes >= pow(2,30)){                     //如果提供的字节数大于等于2的30次方,则条件成立
		$return = round($bytes / pow(1024,3), 2);       //将字节大小转换为同等的G大小
		$suffix = 'GB';                                 //单位为GB
	} elseif ($bytes >= pow(2,20)) {                    //如果提供的字节数大于等于2的20次方,则条件成立
		$return = round($bytes / pow(1024,2), 2);       //将字节大小转换为同等的M大小
		$suffix = 'MB';                                 //单位为MB
	} elseif ($bytes >= pow(2,10)) {                    //如果提供的字节数大于等于2的10次方,则条件成立
		$return = round($bytes / pow(1024,1), 2);       //将字节大小转换为同等的K大小
		$suffix = 'KB';                                 //单位为KB
	} else {                                            //否则提供的字节数小于2的10次方,则条件成立
		$return = $bytes;                               //字节大小单位不变
		$suffix = 'Byte';                               //单位为Byte
	}
	return $return.' '.$suffix;                        //返回合适的文件大小和单位
}

因为得到的数据是每一行一个目录的大小,只有2种信息,使用正则就能将其分开,第一种是目录的大小,单位为B,K,G,T,P等;第二种是目录的完整路径,使用正则求得每个目录大小的字节数然后进行排序。

最后存储到数据库中,可以观察出每个目录大小的变化。

文章网址:http://blog.zhengshuiguang.com/linux/linux-dir-size.html

随意转载^^但请附上教程地址。

标签:监控 统计

评论已关闭