1.4 模板开发者模式与缓存更新
> 打开开发入口,管好缓存,改一次就能看见一次。
两个拦路虎
做 Discuz! 模板开发,有两个环节会反复卡住人:
- 进不去后台的模板设计入口,看不到「设计新模板」和模板变量配置。
- 改完模板刷新页面,纹丝不动,怀疑是不是改错了文件。
这两个问题的答案都在 config/config_global.php 和缓存机制里。
开发者模式开关
在 config/config_global.php 文件末尾加这一行:
<?php
$_config['plugindeveloper'] = 1;
注意是加在文件末尾,不是插进某个条件分支里。这个值开关的是整套开发相关入口:
| 入口 | 没有开发者模式 | 有开发者模式 |
|---|---|---|
| 后台模板 → 设计新模板 | 看不到 | 可用 |
| 插件 → 设计新插件 | 看不到 | 可用 |
| 模板列表 | 只有安装、导入、卸载 | 多出「设计」按钮 |
| 模板变量配置 | 无入口 | 可配置,类型与插件变量一致 |
X5.0 的模板变量完全复刻了插件变量机制,模板可以自带参数配置后台,不必再为此单独配一个插件。开启开发者模式后,模板列表出现「设计」按钮,变量类型和插件变量一致,还多了两个布局分类:标题栏(给多个设置项加小标题)和分组(多页切换,用分组时顺序第一个项目必须是分组类型)。
改完这行,更新缓存并重新登录后台。不重新登录的话菜单是旧的,缓存清了也白清。
更新缓存的几种入口
模板不是每次访问都解析,第一次访问后走的是 data/cache/ 下的编译产物。所以任何影响模板文件、语言包的操作,都需要更新缓存让它重新编译。
| 入口 | 怎么用 | 适用场景 |
|---|---|---|
| 后台界面更新缓存 | 后台 → 界面 → 更新缓存 | 日常开发,最常用 |
| 后台批量更新 | 后台数据更新类工具里执行 | 升级之后 |
直接清理 data/cache/ |
删除该目录下的缓存文件 | 后台进不去时的兜底手段 |
日常就用第一个。第二个一般用不到。第三个要谨慎——data/cache/ 里不只有模板缓存,还有数据缓存,手动清会把数据缓存一起清掉。数据缓存会重新生成,不会损坏数据,但站点在重建期间会明显变慢,大站甚至会有短时压力。所以它只适合「后台进不去」这种救急场景。
什么时候必须清缓存
不是每次改文件都要清。判断标准很简单:你改的东西,是不是编译期就要读进来的。
| 场景 | 必须清缓存吗 | 原因 |
|---|---|---|
改模板 HTML(.htm / .php) |
必须 | 模板已编译成 PHP 缓存,不重编译读不到 |
| 新增或删除模板文件 | 必须 | 文件列表变了,缓存指向的还是老文件 |
改语言包 / {lang} 对应内容 |
必须 | 语言包与模板是两套缓存 |
| 改 CSS 文件 | 必须 | 样式表内容变了,但浏览器可能还有本地缓存,两头都要清 |
改 config/config_global.php |
必须,且要重登录 | 配置项在启动时读取 |
| 改 PHP 业务逻辑 | 不必 | PHP 文件每次请求都重新解析执行 |
| 改数据库数据 | 不必 | 直接读库 |
最后两行值得多看一眼。业务逻辑和数据库的改动之所以不用清缓存,是因为它们压根不经过编译这层——只有模板文件会被编译成缓存。这一条也是判断「我到底改的是哪一层」的最好自查方式。
CSS 那行容易被忽略。改了 CSS 刷页面没反应,有两个可能:一是 Discuz! 缓存了旧样式内容,二是浏览器本地缓存了旧样式文件。两个都要清,Ctrl+F5 强刷浏览器是必要的动作。
清缓存的副作用
要坦率地说:更新缓存不是免费的。
清完之后,第一次访问每个页面都要现场编译模板,这个过程比正常访问慢。站点模板多、页面访问密集的话,这几秒的延迟是真实存在的。
缓解办法很简单:接受它。开发阶段你只关心自己刷的那几个页面,编译成本可以忽略;生产环境上,缓存重建完就恢复常态,而且重建后的缓存对所有访客都是共享的收益。
真正需要注意的是别在流量高峰期做这件事。线上站点做批量更新缓存前,先挑个低峰时段。
实用技巧:把值改成 2
$_config['plugindeveloper'] 除了 1,还有一个值值得知道:2。
| 值 | 效果 |
|---|---|
不写 / 0 |
普通模式,无开发入口 |
1 |
开发模式,可进设计入口、配模板变量 |
2 |
页面源码里输出全部预定义钩子标记 |
把值改成 2 并更新缓存,然后打开任意页面查看源代码,搜索 <hook>,就能看到页面里所有预定义钩子的位置和名字。
这个技巧解决的问题很实际:插件钩子的准确名字经常变版本,文档里写的和实际版本对不上时,与其猜,不如直接读。查钩子名这件事,不要靠记忆,靠搜源码。
注意 2 模式下会往每个页面输出额外的标记,属于调试用途,上线前务必改回 1 或删掉这一行。
一个完整的开发循环
把前面几节串起来,日常循环长这样:
1. 改 config_global.php 开启开发者模式 → 更新缓存 → 重新登录后台
2. 后台 → 模板 → 设计新模板,建套系(或按 1.3 节手写目录骨架)
3. 从 default 只复制真正要改的文件到自己的套系
4. 后台切换到新套系,访问主要页面,确认无报错
5. 开始改文件 → 每次改完更新缓存 → 浏览器强刷
6. 查钩子时把 plugindeveloper 改成 2
7. 完工后改回 1 或删掉,清理调试痕迹
本篇收尾
第一篇到这里结束。你现在应该能回答这几个问题:
- 为什么改完模板看不到效果?——模板被编译成 PHP 缓存在
data/cache/,没更新缓存就没人读你的新文件。 - 为什么进不去模板设计入口?——
config/config_global.php里没有$_config['plugindeveloper'] = 1;。 - 套系和风格怎么选?——改配色换风格,改结构换套系。
下一篇开始,我们进到具体的模板标签和页面开发。
