龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

有意思的一个操作实例(需要在linux环境下跑)-PH

时间:2014-07-22 14:52来源: 作者: 点击:
分享到:
分别使用Linux系统命令du -b与PHP系统函数filesize来获取指定目录下的大小,得到的结果值存在很大的差异。br / br / Google相关知识点,截取内容如下:br / 1. 大部分人都搞错了 du 的作用,
分别使用Linux系统命令du -b与PHP系统函数filesize来获取指定目录下的大小,得到的结果值存在很大的差异。

Google相关知识点,截取内容如下:
1. 大部分人都搞错了 du 的作用,du 不是显示文件大小,而是显示文件所占用的 block 大小,你的分区的 block size   是 4k ,也就是说即使文件只有1个字节,也会占用 4KB 。

不过还是不敢确定是不是这个原因,希望看到此代码的Linux高手能够给予相关指点。 谢谢!

<?php
/**
 * 获取目录大小(分别采用Linux的du命令及PHP系统函数filesize实现)
 *
 */
function  _dirSize($path, $_isCmd = TRUE) {
	$size = 0;
	if ($_isCmd) {
		//注意,linux下文件夹大小位4096byte, 而windows下文件夹大小为0, 所以造成 du统计的大小与filesize统计的大小不一致
		$size = intval(exec('du -b '.escapeshellarg($path)));
	} else {
		$list = scandir($path);
		foreach($list as $val) {
			if ($val == '.' OR $val == '..')
				continue;
			$p = $path.'/'.$val;
			if (is_dir($p)) {
				$size += _dirSize($p, $_isCmd);
			} else {
				$size += filesize($p);
			}
		}
	}
	
	return $size;
}

/**
 * 获取指定目录下子文件夹个数(linux环境下执行)
 *
 */
function _getDirCount($path) {
	return intval((_dirSize($path, TRUE) - _dirSize($path, FALSE))/4096);
}

/**
 * 格式化输出文件大小
 *
 */
function _sizeFormat($size, $unit = '') {
	if ($unit == '') {
		if($unit/1024 >=0  AND $unit/1024 <=1024) {
			$unit = 'K';
		} else if ( $unit/1024 >1024 AND $unit/1024 <= 1024*1024 ) {
			$unit = 'M';
		} else {
			$unit = 'G';
		}
	}
	switch(strtolower($unit)) {
		case 'k':
			$size = ($size/1024);
			$suffix = 'KB';
			break;
		case 'm':
			$size = ($size/1024/1024);
			$suffix = 'MB';
			break;
		case 'g':
			$size = ($size/1024/1024/1024);
			$suffix = 'GB';
			break;
	}
	$size = sprintf("%.2f%s", $size, $suffix);
	return $size;
}

$path = 'min';
var_dump(_dirSize($path, FALSE));
var_dump(_dirSize($path, TRUE));
var_dump(_getDirCount($path));

/*end of php*/
精彩图集

赞助商链接