在網站開發初期,將所有上傳文件集中存放在單一目錄下並無大礙。但隨著網站規模擴大、文件數量激增,單一目錄會導致文件系統性能下降、管理困難。此時採用自動分配子目錄的策略至關重要。本文介紹兩種常見的 PHP 實作方式:數字 ID 分級法與雜湊分散法。
利用文件的數字 ID,透過固定寬度格式化並切分為多層目錄。例如 ID 122333 格式化為 12 位數「000000122333」,每 3 位切分一次,形成三層目錄結構:
<?php
function allotPath($id, $extend = 'jpg') {
$folders = str_split(sprintf("%012s", $id), 3);
$folders[3] = $id;
return '/' . join('/', $folders) . '.' . $extend;
}
var_dump(allotPath(122333));
// 輸出: string(23) "/000/000/122/122333.jpg"
?>
此法優點在於目錄層級固定、易於預測路徑,適合 ID 連續增長的場景。
對 ID 進行 MD5 雜湊,取前 8 字元每 2 字元切分一層,共 4 層目錄,將文件均勻分散:
<?php
function allotHashPath($id, $extend = 'jpg') {
$folders = array_slice(str_split(md5($id), 2), 0, 4);
$folders[] = $id;
return '/' . join('/', $folders) . '.' . $extend;
}
var_dump(allotHashPath(122333));
// 輸出: string(23) "/9c/7c/c2/cd/122333.jpg"
?>
雜湊法能有效避免熱點目錄,適合大規模隨機文件分布。
實際專案中亦可結合日期(如 Y/m/d)作為第一層目錄,再輔以上述演算法,兼顧時間歸檔與負載均衡。開發者可根據業務特性靈活組合。