在日常的Web开发中,有时候我们需要获取某个目录(包括其子目录)所占用的磁盘空间,比如用于配额限制、资源统计或日志监控等目的。PHP 提供了一些内置函数,能帮助我们方便地获取目录的磁盘总大小。
disk_total_space() 可以直接获取磁盘的总容量,但注意它返回的是整个磁盘的容量,而不是目录实际占用的大小。
$directory = "/var/log";
$total_space = disk_total_space($directory);
echo "磁盘总容量:$total_space 字节";
通过遍历目录并使用 filesize() 读取每个文件的大小,可以较为准确地获取该目录所占的实际磁盘空间。
$directory = "/var/log";
$total_size = 0;
if ($dh = opendir($directory)) {
while (($file = readdir($dh)) !== false) {
if ($file != "." && $file != "..") {
$total_size += filesize($directory . "/" . $file);
}
}
closedir($dh);
}
echo "磁盘总大小:$total_size 字节";
通过 RecursiveDirectoryIterator 与 RecursiveIteratorIterator 结合,可以递归地获取目录及其子目录中所有文件的大小,适合深层目录结构。
use RecursiveIteratorIterator;
use RecursiveDirectoryIterator;
use SplFileInfo;
$directory = "/var/log";
$total_size = 0;
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($directory),
RecursiveIteratorIterator::SELF_FIRST
);
foreach ($iterator as $file) {
if ($file->isFile()) {
$total_size += $file->getSize();
}
}
echo "磁盘总大小:$total_size 字节";
scandir() 可用于获取目录中的所有文件名,结合 array_map() 和 array_sum() 可简洁计算总大小。不过,这种方法无法递归子目录,适用于平级目录统计。
$directory = "/var/log";
$files = scandir($directory);
$total_size = array_sum(array_map("filesize", array_filter(
array_map(function($file) use ($directory) {
return $directory . '/' . $file;
}, $files),
function($file) {
return is_file($file);
}
)));
echo "磁盘总大小:$total_size 字节";
PHP 提供了多种方式来实现目录磁盘大小的计算,每种方法都有其适用场景。选择合适的方法不仅可以提高执行效率,还能使代码更加简洁可靠。开发者可根据自身需求灵活运用。