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

ThinkPHP 實作一鍵清除快取功能(後台 AJAX + 遞迴刪除)

     編輯:PHP 綜合知識

功能需求

CMS 系統常需「一鍵清除快取」功能,解決資料更新不即時問題。ThinkPHP 預設快取儲存在 /Runtime/Temp/ 及 /Runtime/~runtime.php。

後端控制器

<?php
public function cache() {
    // AJAX POST 請求處理
    if ($_POST['type']) {
        $type = $_POST['type'];
        $name = explode('-', $type);  // 以 "-" 分割多個目錄
        $count = count($name);
        
        // 專案根目錄下的 Runtime 路徑
        $abs_dir = dirname(dirname(dirname(dirname(__FILE__))));
        $pa = $abs_dir . 'indexRuntime';
        $runtime = $abs_dir . 'indexRuntime~runtime.php';
        
        // 刪除核心快取檔
        if (file_exists($runtime)) {
            unlink($runtime);
        }
        
        // 逐一刪除指定子目錄
        for ($i = 0; $i < $count; $i++) {
            $this->rmFile($pa, $name[$i]);
        }
        
        $this->ajaxReturn(1, '清除成功', 1);
    } else {
        $this->display();
    }
}

// 遞迴刪除目錄下所有檔案
public function rmFile($path, $fileName) {
    $path = preg_replace('/(\/){2,}|(\\){1,}/', '/', $path); // 修正路徑分隔符
    $path .= $fileName;
    
    if (is_dir($path)) {
        if ($dh = opendir($path)) {
            while (($file = readdir($dh)) !== false) {
                // 跳過 . 與 ..
                if ($file != '.' && $file != '..') {
                    $full = $path . '/' . $file;
                    if (is_dir($full)) {
                        $this->rmFile($path, $file); // 遞迴刪除子目錄
                    } else {
                        unlink($full);
                    }
                }
            }
            closedir($dh);
            // 可選:刪除空目錄 @rmdir($path);
        }
    }
}
?>

前端頁面

<script src="__PUBLIC__/admin/js/jquery.js"></script>
<script type="text/javascript">
$(function() {
    $('#button').click(function() {
        if (confirm("確認要清除快取?")) {
            var $type = $('#type').val();
            $.post('__URL__/clear', {type: $type}, function(data) {
                alert("快取清理成功");
            });
        }
        return false;
    });
});
</script>

<!-- 表單範例 -->
<input type="hidden" id="type" value="Temp-Cache-Logs" />
<button id="button">一鍵清除快取</button>

改進建議

問題改進方案
硬編碼路徑層級使用 RUNTIME_PATH 常數或 C('RUNTIME_PATH') 取得標準路徑
遞迴刪除未處理子目錄在 rmFile 中判斷 is_dir 並遞迴呼叫
無權限檢查加入後台權限驗證(RBAC/ACL)
大量檔案超時分批次 AJAX 請求、或使用 CLI 指令 php think clear
快取類型不完整支援 Cache::clear()、S('key', null)、Opcode 快取清理

現代 ThinkPHP 5/6/8 寫法

// TP5+ 內建指令
php think clear

// 程式碼中清除
use think\facade\Cache;
Cache::clear();           // 清除所有快取
Cache::rm('key');         // 刪除指定鍵
Cache::tag('tagName')->clear(); // 按標籤清除
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved