設計目標
- 避免單一目錄檔案過多影響效能,採用 MD5 雜湊建立多層子目錄。
- 支援陣列與字串資料儲存,自動序列化/反序列化。
- 提供建立、讀取、刪除、取得路徑等完整介面。
核心程式碼
class Cache {
const CACHE_ROOT = '/path/to/cache/'; // 定義快取根目錄
// 建立雜湊子目錄:MD5 取前 4 字元各為一層
private function createHashDir($sign) {
$md5 = md5($sign);
$dir = '';
for ($i = 1; $i <= 4; $i++) {
$dir .= $md5[$i] . '/';
$full = self::CACHE_ROOT . $dir;
if (!is_dir($full)) mkdir($full, 0755, true);
}
return self::CACHE_ROOT . $dir;
}
// 寫入快取
public function setCacheFile($data, $sign = 'a', $type = 'array', $id = '') {
$cacheDir = $this->createHashDir($sign);
if (!empty($data)) {
$id = $id ? $id : $sign;
$cacheFile = $cacheDir . $id . '.php';
$content = ($type == 'array') ? var_export($data, true) : $data;
file_put_contents($cacheFile, "");
}
}
// 讀取快取
public function getCacheFile($sign = 'a', $id = '') {
$cacheDir = $this->createHashDir($sign);
$id = $id ? $id : $sign;
$cacheFile = $cacheDir . $id . '.php';
if (is_file($cacheFile) && include_once($cacheFile)) {
return $$sign;
}
return false;
}
// 取得快取檔案路徑
public function getCacheFilePath($sign = 'a', $id = '') {
$cacheDir = $this->createHashDir($sign);
$id = $id ? $id : $sign;
return $cacheDir . $id . '.php';
}
// 刪除快取
public function delCacheFile($sign = 'a', $id = '') {
$cacheDir = $this->createHashDir($sign);
$id = $id ? $id : $sign;
$cacheFile = $cacheDir . $id . '.php';
return $this->del_file($cacheFile);
}
private function del_file($path) {
return is_file($path) ? unlink($path) : false;
}
}
使用範例
$cache = new Cache();
// 寫入陣列資料
$cache->setCacheFile(['name' => 'John', 'age' => 25], 'user', 'array', '1001');
// 讀取
$userData = $cache->getCacheFile('user', '1001');
print_r($userData);
// 刪除
$cache->delCacheFile('user', '1001');
關鍵點說明
- 雜湊目錄深度固定 4 層,可依檔案量調整。
- 快取檔案以 PHP 回傳變數方式儲存,
include_once 可直接載入並受 opcode 快取加速。
- 建議搭配快取過期機制(如檔案修改時間判斷)使用。