当前位置: 首页> 最新文章列表> PHP获取指定目录磁盘大小的四种实用方法

PHP获取指定目录磁盘大小的四种实用方法

M66 2025-07-26

PHP实现获取目录磁盘总大小的方法

在日常的Web开发中,有时候我们需要获取某个目录(包括其子目录)所占用的磁盘空间,比如用于配额限制、资源统计或日志监控等目的。PHP 提供了一些内置函数,能帮助我们方便地获取目录的磁盘总大小。

使用 disk_total_space 获取磁盘总容量

disk_total_space() 可以直接获取磁盘的总容量,但注意它返回的是整个磁盘的容量,而不是目录实际占用的大小。


$directory = "/var/log";
$total_space = disk_total_space($directory);
echo "磁盘总容量:$total_space 字节";

使用 dir() 和 filesize() 累加目录文件大小

通过遍历目录并使用 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 字节";

使用 RecursiveIteratorIterator 递归统计大小

通过 RecursiveDirectoryIteratorRecursiveIteratorIterator 结合,可以递归地获取目录及其子目录中所有文件的大小,适合深层目录结构。


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_sum() 快速实现

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 字节";

性能优化建议

  • 推荐使用递归迭代器方式,兼顾性能和准确性。
  • 尽量避免使用 glob() 函数,其在大文件夹中效率不高。
  • 如需频繁获取目录大小,可考虑将结果缓存至数据库或缓存文件中。

总结

PHP 提供了多种方式来实现目录磁盘大小的计算,每种方法都有其适用场景。选择合适的方法不仅可以提高执行效率,还能使代码更加简洁可靠。开发者可根据自身需求灵活运用。