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
相关产品推荐
相关产品推荐

