在日常的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 提供了多種方式來實現目錄磁盤大小的計算,每種方法都有其適用場景。選擇合適的方法不僅可以提高執行效率,還能使代碼更加簡潔可靠。開發者可根據自身需求靈活運用。