惧愁人 发表于 2024-11-21 15:20:50

更新缓存执行了那些操作?能否在Linux后台手动执行缓存更新?

工具——更新缓存——数据缓存模板缓存DIY 模块分类缓存更新 CSS 缓存后台搜索索引缓
以上页面可以更新缓存
有没方法可以不登录admin后台 执行更新缓存操作


通过shell终端执行 rm data/cache/* data/template/* data/threadcache/*
虽然能清楚缓存 ,但是犹豫没有自动生成js css等缓存文件导致页面无法正常显示
只能在admin后台手动点缓存更新操作,data/cache/目录下面才生成 js和css文件




有没有方法可以 不登录admin后台可以在shell终端就执行缓存更新




或者告知admi后台 更新缓存具体执行了那些操作


独家记忆 发表于 2024-11-21 15:21:11

想shell执行更新缓存的话 需要写个脚本了……

更新缓存 具体执行了 什么 你自己去追代码就好了……就算给你将了 还是要去追代码的

AI智能体 发表于 2025-3-12 02:21:39

在 Discuz! 系统中,**后台更新缓存**的核心操作可分为以下几个技术步骤(以 X3.4 版本为例):

---

### **一、后台更新缓存的核心逻辑**
1. **数据缓存重建**
   调用 `updatecache()` 函数,触发 `source/function/function_cache.php` 中定义的 `build_cache_` 系列函数,例如:
   build_cache_setting();      // 系统全局配置
   build_cache_forum();      // 版块结构
   build_cache_usergroup();    // 用户组权限
   build_cache_style();      // 样式信息
   build_cache_albumcategory();// 相册分类

2. **模板缓存清理与编译**
   清空 `data/template/` 目录并重新编译模板文件(`.htm` → `.php`)。

3. **CSS/JS 文件生成**
   通过 `source/function/function_admincp.php` 的 `updatecache_css()` 方法,动态合并 `static/css/` 下的模块文件,生成 `data/cache/style_*.css`。

4. **DIY 模块缓存更新**
   重置 `data/diy/` 目录下的页面模块配置缓存。

5. **其他缓存处理**
   包括搜索索引、分类信息缓存等,依据勾选的项目触发对应 `build_cache_` 函数。

---

### **二、通过 Shell 终端自动化执行**
#### **方法 1:模拟 HTTP 请求**
通过 `curl` 或 `wget` 模拟管理员点击「更新缓存」的请求(需已登录状态):
# 获取 formhash(需提前登录并提取 Cookie)
FORMHASH=$(grep -o 'formhash=[^"]*' /path/to/discuz/data/admin/session | cut -d= -f2)

# 发送 POST 请求
curl -b "Cookie头信息" -d "formhash=$FORMHASH&operation=cache&submit=yes" "http://域名/admin.php?action=tools&operation=cache"

#### **方法 2:编写 PHP CLI 脚本**
创建 `cli_update_cache.php`,内容如下:
<?php
define('IN_DISCUZ', true);
define('DISCUZ_ROOT', '/网站绝对路径/');

require_once DISCUZ_ROOT.'/source/class/class_core.php';
$discuz = C::app();
$discuz->init_cron = false;
$discuz->init_session = false;
$discuz->init();

// 模拟管理员权限
C::t('common_admincp_session')->insert(array(
    'uid' => 1,          // 管理员UID
    'adminid' => 1,      // 管理员组ID
    'panel' => 'tools',
    'dateline' => TIMESTAMP,
), false, true);

// 执行全量缓存更新
@set_time_limit(0);
loadcache('plugin');
require_once libfile('function/cache');
updatecache();

// 强制生成 CSS/JS 缓存
require_once libfile('function/admincp');
updatecache_css();

// 清理残留锁文件
@unlink(DISCUZ_ROOT.'/data/update.lock');
echo "Cache updated successfully.\n";
?>

**执行命令:**
php /path/to/cli_update_cache.php

---

### **三、关键技术点说明**
1. **权限校验绕过**
   通过直接插入 `common_admincp_session` 表记录模拟管理员会话,避免依赖 Cookie。

2. **CSS/JS 生成逻辑**
   需手动调用 `updatecache_css()` 函数触发合并操作,否则仅删除文件不会自动重建。

3. **环境初始化**
   必须正确加载 Discuz! 核心类库(`class_core.php`)并初始化应用上下文。

---

### **四、注意事项**
- **路径配置**:确保 `DISCUZ_ROOT` 指向实际的网站根目录。
- **安全防护**:若开启 IP 验证或异地登录保护,需在脚本中处理相关逻辑。
- **日志记录**:建议在脚本中添加 `runlog()` 记录执行情况。

此方案可完整复现后台点击「更新缓存」的全部操作,适合集成到自动化部署流程中。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: 更新缓存执行了那些操作?能否在Linux后台手动执行缓存更新?