![Mediawiki:防止模板编辑导致作业队列超载的安全方法?](https://linux22.com/image/1612316/Mediawiki%EF%BC%9A%E9%98%B2%E6%AD%A2%E6%A8%A1%E6%9D%BF%E7%BC%96%E8%BE%91%E5%AF%BC%E8%87%B4%E4%BD%9C%E4%B8%9A%E9%98%9F%E5%88%97%E8%B6%85%E8%BD%BD%E7%9A%84%E5%AE%89%E5%85%A8%E6%96%B9%E6%B3%95%EF%BC%9F.png)
当主要模板更新时,如何缓解作业队列条目泛滥的问题?删除队列并跳过更新链接表是否安全?
这个想法是,我应该能够根据需要编辑模板,而不会淹没队列。大多数使用模板的页面将是档案,几乎从未被访问过。
我更喜欢一种动态的“根据请求更新”方法,以尽量减少开销和存储空间:
- 每当模板更新时,跳过 Mediawiki 作业队列。特别是,队列存储空间量不得随使用任何模板的页面数量而扩展。
- 每个页面(常规页面和模板页面)都会保留其最后一次编辑或更新的时间戳。
- 当请求页面时,其模板会展开以向用户生成最终 HTML。在此过程中,所请求页面上的所有模板的时间戳都会与页面的时间戳进行核对。
- 如果页面的时间戳大于(在)其包含的所有模板的时间戳,则该页面并非过时,因此无需更新任务。否则,在将 HTML 内容发送到浏览器之前,在页面上运行作业队列更新并将其时间戳更新为处理(显示)步骤中遇到的最新模板时间戳。
与现有的简单方法相比,这种架构具有以下优势:
- 避免使用给定模板的作业队列随着页面数量扩展而产生的线性存储成本。
- 链接表更新仅针对活跃使用和请求的页面进行。不会在大部分无人查看的存档页面上浪费任何资源(时间或存储)
有什么办法可以做到这一点?
尽职调查:我查找了有关链接表的文档,但几乎没有。
Google 搜索示例:
- mediawiki“链接表”文档
- mediawiki 在模板更改时跳过更新链接表
- https://www.mediawiki.org/wiki/Manual:Pagelinks_table仅提供技术表格规范,对问题没有帮助
答案1
扩展模板(然后渲染 HTML)的成本很高,而且每次请求时都这样做可能会立即导致您的网站崩溃。您可能可以从解析器缓存中移除该页面,但当该页面的模板被编辑时,不会重新解析它。(但是,您如何知道该页面的模板已被编辑?通过在模板编辑时始终重新解析页面来保持页面 <--> 模板关系图的准确性。)
如果您不关心您的页面是否与模板更改保持同步,以及是否与与 templatelinks 表相关的其他功能(如 Special:Whatlinkshere)保持同步,则跳过递归链接更新不会造成任何其他问题。我认为没有很好的方法可以做到这一点,但您可以通过$linksupdate->mRecursive
在LinksUpdateConstructed
钩。