首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 遞歸計算目錄大小的完整實現方案

     編輯:PHP 綜合知識

PHP 計算目錄總大小的核心邏輯

在 PHP 中計算某個目錄(包含所有子目錄和文件)的總大小,最常用的方法是編寫一個遞歸函數。該函數遍歷目錄下的每一項,若為文件則累加其大小,若為子目錄則遞歸調用自身繼續統計。

核心代碼實現

function dirsize($dir) {
    $dh = @opendir($dir);
    $size = 0;
    while (($file = @readdir($dh)) !== false) {
        if ($file !== '.' && $file !== '..') {
            $path = $dir . '/' . $file;
            if (is_dir($path)) {
                $size += dirsize($path);
            } elseif (is_file($path)) {
                $size += filesize($path);
            }
        }
    }
    @closedir($dh);
    return $size;
}

使用示例與單位換算

調用函數後,返回的單位是字節。通常我們會將其轉換為 MB 或 GB 以便閱讀:

$targetDir = "/var/www/lg";
$totalBytes = dirsize($targetDir);
$totalMB = $totalBytes / 1024 / 1024;
echo "目錄大小: " . round($totalMB, 2) . " MB";

注意事項與優化建議

  • 權限問題:使用 @ 抑制錯誤提示雖然方便,但生產環境建議加入錯誤處理,例如判斷 is_readable()。
  • 性能考量:對於極大目錄(如數萬文件),遞歸可能導致棧溢出或執行超時。可考慮使用 RecursiveDirectoryIterator 配合 RecursiveIteratorIterator 實現非遞歸遍歷,並配合 set_time_limit(0) 移除執行時間限制。
  • 符號鏈接:is_dir() 和 is_file() 會自動解析符號鏈接,若需跳過鏈接文件,可額外加入 is_link() 判斷。

現代化寫法(PHP 5.5+)

function getDirectorySize(string $directory): int {
    $size = 0;
    $iterator = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($directory, RecursiveDirectoryIterator::SKIP_DOTS)
    );
    foreach ($iterator as $file) {
        if ($file->isFile()) {
            $size += $file->getSize();
        }
    }
    return $size;
}

此寫法更符合現代 PHP 標準,代碼更簡潔且自帶錯誤異常機制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved