You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Yii2 PageCache特定Action缓存失效实现咨询

手动失效Yii2特定Action的PageCache(控制台实现)

嘿,我之前刚好解决过类似的需求,要手动失效特定Action的PageCache而不依赖缓存依赖,完全可以通过控制台命令来实现,下面是具体步骤和代码示例:

核心思路

Yii2的PageCache是基于请求上下文生成缓存键的,主要包含路由、请求参数、语言这几个核心要素。我们只需要在控制台中构造出和目标请求一致的上下文,生成对应的缓存键,就能直接删除或重建缓存。

步骤1:创建控制台控制器

在console/controllers目录下新建CacheController.php,用来处理缓存失效/重建的命令:

<?php

namespace console\controllers;

use yii\console\Controller;
use yii\filters\PageCache;

class CacheController extends Controller
{
    /**
     * 失效指定Action的PageCache
     * @param string $route 路由,比如site/index
     * @param string $language 语言,比如en
     * @param array $params 请求参数,比如id=1
     */
    public function actionInvalidatePageCache($route, $language, $params = [])
    {
        // 1. 构造缓存键的核心部分(和PageCache内部生成逻辑对齐)
        $keyParts = [
            PageCache::class,
            $route,
            http_build_query($params),
            $language,
        ];

        // 2. 生成最终的缓存键
        $cacheKey = \Yii::$app->cache->buildKey($keyParts);

        // 3. 删除缓存
        if (\Yii::$app->cache->delete($cacheKey)) {
            $this->stdout("成功失效缓存:{$cacheKey}\n");
        } else {
            $this->stdout("缓存不存在或删除失败\n");
        }
    }

    /**
     * 重建指定Action的PageCache(先失效再重新生成)
     * @param string $route 路由
     * @param string $language 语言
     * @param array $params 请求参数
     */
    public function actionRebuildPageCache($route, $language, $params = [])
    {
        // 先清理旧缓存
        $this->actionInvalidatePageCache($route, $language, $params);

        // 4. 模拟Web请求生成新缓存
        $webConfig = require \Yii::getAlias('@app/config/web.php');
        $webApp = new \yii\web\Application($webConfig);
        $webApp->language = $language;

        // 设置请求上下文
        $webApp->request->setPathInfo($route);
        $webApp->request->setQueryParams($params);

        // 运行Action,触发PageCache生成新缓存
        try {
            $webApp->runAction($route, $params);
            $this->stdout("成功重建缓存:{$route}?".http_build_query($params)."\n");
        } catch (\Exception $e) {
            $this->stderr("重建缓存失败:{$e->getMessage()}\n");
        }
    }
}

步骤2:执行控制台命令

失效缓存

在终端运行以下命令,即可针对en/site/index?id=1的缓存进行失效:

yii cache/invalidate-page-cache site/index en 'id=1'

重建缓存

如果需要直接生成新缓存,运行:

yii cache/rebuild-page-cache site/index en 'id=1'

注意事项

  • 缓存组件一致性:确保控制台应用和Web应用使用的是同一个缓存组件(比如Redis、Memcached),如果用文件缓存,要保证控制台和Web进程的缓存路径一致。
  • 自定义PageCache配置:如果你的PageCache配置了varyBySession、varyByUser或其他自定义缓存键参数,需要在$keyParts中添加对应的信息,否则无法匹配到正确的缓存键。
  • 测试验证:可以先通过\Yii::$app->cache->get($cacheKey)打印缓存内容,确认键的正确性后再执行删除操作。

内容的提问来源于stack exchange,提问作者sim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:41:38