diff --git a/application/common/behavior/RedisSiteConfig.php b/application/common/behavior/RedisSiteConfig.php new file mode 100644 index 0000000000000000000000000000000000000000..8f31ddc860655d5d1ea7be8d34879e414e14b7af --- /dev/null +++ b/application/common/behavior/RedisSiteConfig.php @@ -0,0 +1,75 @@ + self::all() + ]); + } + } + + public static function isEnableRedis(): bool + { + return strtolower(Config::get('cache.type')) === 'redis'; + } + + public static function getCacheKey(): string + { + // 缓存键名,根据目录结构哈希,确保不同项目配置不冲突 + return 'fastadmin:site_config:' . md5(__DIR__); + } + + /** + * 获取全部 site 配置 + */ + public static function all(): array + { + try { + return Cache::remember(self::getCacheKey(), self::loadFromDb(), 0); + } catch (\Throwable $e) { + // Redis 挂了也不能影响站点 + Log::error('SiteConfig cache error: ' . $e->getMessage()); + return self::loadFromDb(); + } + } + + /** + * 强制刷新缓存 + */ + public static function refresh(): void + { + Cache::rm(self::getCacheKey()); + } + + /** + * 从数据库加载 site 配置 + */ + protected static function loadFromDb(): array + { + $config = []; + $configList = \app\common\model\Config::all(); + foreach ($configList as $k => $v) { + $value = $v->toArray(); + if (in_array($value['type'], ['selects', 'checkbox', 'images', 'files'])) { + $value['value'] = explode(',', $value['value']); + } + if ($value['type'] == 'array') { + $value['value'] = (array)json_decode($value['value'], true); + } + $config[$value['name']] = $value['value']; + } + + return $config; + } + +} diff --git a/application/common/model/Config.php b/application/common/model/Config.php index 64765b259a86775926f535ecfc41e0a9ef587e20..bba9087a16353094068fb01213d46d6fe4da92b3 100644 --- a/application/common/model/Config.php +++ b/application/common/model/Config.php @@ -206,6 +206,13 @@ class Config extends Model if (!\app\admin\library\Auth::instance()->check('general/config/edit')) { return false; } + + if (\app\common\behavior\RedisSiteConfig::isEnableRedis()) { + // 刷新 Redis 缓存 + \app\common\behavior\RedisSiteConfig::refresh(); + return true; + } + $config = []; $configList = self::all(); foreach ($configList as $k => $v) { diff --git a/application/tags.php b/application/tags.php index 40f076fe5b20089824b06819ed06cc53b2e2db3c..3c8add34d95a961050b677a19a0590650c81820b 100755 --- a/application/tags.php +++ b/application/tags.php @@ -14,6 +14,7 @@ return [ // 应用初始化 'app_init' => [ 'app\\common\\behavior\\Common', + 'app\\common\\behavior\\RedisSiteConfig', ], // 应用开始 'app_begin' => [],