社区文档构建进行中,欢迎编辑。社区答疑群(非官方):717421103
缓存
阅读
2024-04-27更新
最新编辑:Lu_23333
阅读:
更新日期:2024-04-27
最新编辑:Lu_23333
缓存能加快页面加载,提升用户体验。BWiki使用了多种缓存机制,这主要包括:页面缓存、资源缓存和针对URL的缓存。
下文将简述BWiki平台的缓存特性,缓存策略可能随平台优化变化,请以实际表现为准。要了解技术细节,请参考MW官方Manual:Cache。
页面缓存
内容页面缓存能让用户更快访问页面。
CDN缓存
页面生成的HTML会被CDN(Content delivery network,内容分发网络)服务缓存。
未登录用户的缓存时间较长,无法主动刷新。
登录用户的缓存时间非常短。极端情况下会遇到客户端“串缓存”(RLCONF信息如小组件配置是其他用户的),但不影响使用。
Mediawiki缓存
Wiki系统会缓存解析器的解析结果,缓存时间可达数天。
只有在修改页面或手动刷新时,缓存才会提前更新。
例子:日期彩蛋
假设现有页面A,使用了解析函数 time
获取当前星期,如果今天是星期四,则显示彩蛋。然而,星期四访问页面时没有显示彩蛋。
因为访问页面A时会优先使用缓存内容,缓存不会每天刷新(有效期数天)。
例子:模板缓存
假设现有页面A,使用了模板B。修改模板B后,访问页面A,发现A没有变化
因为A的缓存是基于旧的B建立的。此时刷新页面A的即可显示最新内容。
用户访问页面时发生了什么?
- 浏览器会优先使用自身缓存(此步骤与BWiki无关);
- BWiki优先提供CDN缓存内容。离用户最近的CDN服务器仅需几毫秒就能响应用户请求(而不是等待延迟更高的远端服务器);
- 如果没有CDN缓存,Wiki系统将尝试提供其缓存(解析器缓存)。这能手动刷新(purge)或通过空编辑刷新;
- 如果没有缓存,Wiki系统将尝试重新构建这个页面,这需要从数据库获取数据(仍会使用其他页面/模板/SMW的缓存数据,并使用数据库缓存);
- 这些(被过度简化描述的)步骤通常会在200毫秒内完成。如果用户请求成功命中某层缓存,其等待时间将大大缩短,同时降低服务器负载;
- 浏览器收到页面HTML后,会开始解析、请求资源并显示给用户。
资源缓存
BWiki缓存的资源文件包括CSS、JavaScript和多媒体文件(图片、音频和视频等)。
多媒体文件
多媒体文件变更后,缓存会立即更新。
代码文件
CSS、JS文件变更后,缓存更新时间约30分钟(通常会更快)。
因此,很多BWiki的界面管理员会尝试若干“绕过缓存”的方法来实时测试更改(见下文)。
URL缓存
部分HTTP Get请求会被基于URL建立缓存,如对index.php
、load.php
的Get请求。
一些使用方式在底层触发了上述机制,如:
- 短链接。如:
https://wiki.biligame.com/tools/?curid=2363
- 手动加载JS、CSS。如:
mw.loader.load("/tools/MediaWiki:Demo.js?action=raw&ctype=text/javascript", "text/javascript");
这些缓存与代码文件的缓存刷新时间一致,约30分钟。
因此,分享带有curid的“短链接”时,需要注意用户可能会访问到近期的缓存内容。
刷新和绕过缓存
刷新缓存
首先检查登录状态,因为未登录用户会优先显示无法绕过、刷新的缓存。
然后,判断需要刷新哪些缓存(修改了CSS、JS后,只能等待约30分钟等待缓存自动刷新。)
如修改模板后,不会触发引用此模板的页面刷新缓存。这需要最多数天时间自动刷新。此时如果需要尽快展示最新版本,可以手动刷新:
- 页面右上方的菜单:Wiki功能 - 刷新,如右图所示。
- 在页面后方增加参数action,值为purge。如
?action=purge
,对于本页面为:wiki.biligame.com/tools/缓存?action=purge
- 空编辑,即编辑页面,在不更改的情况下保存页面。
- API刷新,通过调用API的方式刷新缓存或进行空编辑来刷新页面。
- 其他非通用方式。一些widget允许你批量刷新。部分Wiki在导航栏提供的页面操作-刷新页面,或部分油猴脚本提供的刷新功能(这些刷新功能是自动调用上述方法之一)。
- Widget:刷新 刷新指定的多个页面(以英文逗号或顿号分隔)
- MediaWiki:Bikit.js 中的 Bikit.fixs.purgeCategory 为分类页面增加批量刷新按钮
- 刷新链入页面 提供了JS和Python代码。
- BwikiBatchEditor小部件提供的额外工具栏中,包括刷新当前页面的功能,仅支持在安装此小部件的wiki使用。
- BWiki工具列表。这个油猴脚本在所有BWiki站点增加额外工具栏,包括刷新当前页面的功能。
- BWiki快捷菜单栏。这个油猴脚本让BWiki的功能菜单栏始终居右显示
绕过缓存
警告:让所有用户绕过缓存会极大增加服务器负载,浪费公共资源。
加载额外JS、CSS时,通常使用如mw.loader.load("/tools/MediaWiki:Demo.js?action=raw&ctype=text/javascript", "text/javascript");
等写法。
如果为资源URL增加随机数,则可以“绕开”缓存,如mw.loader.load("/tools/MediaWiki:Demo.js?action=raw&ctype=text/javascript&rand="+Math.random(), "text/javascript");
这可以用于在开发期间手动在控制台加载额外的JS进行测试,也可以在Common.js中绕开缓存加载资源。
需要注意的是,绝不建议在Common.js、小组件JS中直接使用带随机数的加载方式。
推荐在需要时,使用mw.config.values.wgUserGroups
变量检查用户权限,或用户bid来限制范围。(在mw生命周期早期,mw.config内容不完整时,用户权限可以用RLCONF.wgUserGroups
替代。要获取用户名,除了mw变量,还可以使用主站api:line3-h5-pc-api.biligame.com/game/user/myinfo
获取当前用户的bid和昵称)
相关资料
其他wiki农场关于缓存的文档。
- 缓存【灰机Wiki】:www.huijiwiki.com/wiki/帮助:Huiji缓存
- 清除缓存【Fandom】:community.fandom.com/wiki/Help:Purge
- Manual:Cache【Mediawiki】:https://www.mediawiki.org/wiki/Manual:Cache