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

PHP 建立多層目錄的最佳實作:遞迴建立與存在性檢查

     編輯:PHP 相關知識

常見需求

專案中常需動態建立上傳目錄、快取目錄等多層資料夾結構。PHP 內建 mkdir() 預設不支援遞迴建立(PHP 5 以前),且若目錄已存在會拋出警告。本文整理出穩健、可重複執行的建立邏輯。

程式碼範例

<?php
/**
 * 遞迴建立多層目錄,若目錄已存在則略過,不產生錯誤。
 *
 * @param string $base_path  基礎路徑(絕對或相對)
 * @param array  $sub_dirs   子目錄陣列,例如 ['tmp', 'qvod', 'cache']
 * @param int    $mode       權限,預設 0755
 * @return bool              是否全部成功
 */
function ensure_dirs(string $base_path, array $sub_dirs, int $mode = 0755): bool
{
    $current = rtrim($base_path, DIRECTORY_SEPARATOR);
    foreach ($sub_dirs as $dir) {
        $current .= DIRECTORY_SEPARATOR . $dir;
        if (!is_dir($current)) {
            // recursive=true 會自動建立父層;錯誤抑制器避免競態條件下的 warning
            if (!@mkdir($current, $mode, true)) {
                error_log("建立目錄失敗: $current");
                return false;
            }
        }
    }
    return true;
}

// 使用範例
$root = __DIR__ . '/storage';
$dirs = ['tmp', 'qvod', 'logs', 'cache'];
ensure_dirs($root, $dirs);

關鍵點解析

  1. 使用 `DIRECTORY_SEPARATOR`:跨平台相容 Windows (`\`) 與 Linux (`/`)。
  2. `mkdir($path, $mode, true)`:第三個參數 `true` 啟用遞迴建立(PHP 5.0.0+),無需手寫遞迴函式。
  3. 錯誤抑制 `@` + `error_log`:避免高併發時「目錄剛被其他進程建立」導致的 Warning,改為記錄日誌供事後排查。
  4. 回傳布林值:方便上層邏輯判斷是否繼續執行後續寫入操作。

進階:搭配 Composer 自動載入的專案結構

project-root/
├── config/
│   └── paths.php          // 定義 STORAGE_PATH 等常數
├── src/
│   └── Filesystem/
│       └── DirectoryManager.php  // 封裝上述函式為服務類
├── storage/               // 執行期自動建立
│   ├── tmp/
│   ├── qvod/
│   └── logs/
└── vendor/

在服務容器中註冊 `DirectoryManager`,於應用啟動階段(如 Laravel 的 `AppServiceProvider::boot()`)呼叫 `ensureDirs()`,確保所有儲存路徑就緒。


原文摘自 cyuyan112233 專欄

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