【问题标题】:Optimized/faster wikitext parsing in Mediawiki extension?Mediawiki 扩展中优化/更快的 wikitext 解析?
【发布时间】:2017-02-10 19:06:05
【问题描述】:

我目前正在开发一个需要解析页面上的 wikitext 的 Mediawiki 扩展。目前我使用 Parser::preprocess。这会增加几秒钟的页面加载时间。

有没有更快的方法来做到这一点?特别是,它必须解析 wikitext,扩展所有模板和解析器函数,并检查结果中的特定字符串。

【问题讨论】:

  • 页面保存时执行,存储结果。
  • 我需要 userCan 钩子中的解析结果。有没有可以缓存解析结果的变量?

标签: mediawiki mediawiki-extensions


【解决方案1】:

解析不是您可以合理期望的快速操作;您应该以这样一种方式设计您的扩展,即它只需要在页面的 wikitext(或其某些依赖项)更改时才需要进行解析 - 即。将任何逻辑集成到解析器挂钩之一中,例如 InternalParseBeforeSanitize 并存储结果。

通常您会为此使用page_props 表(参见ParserOutput::setProperty),但如果这与安全相关,您应该仔细考虑是否适合您(它是每页,而不是每修订,在页面和更新的道具表之间有一个小窗口)。在某些未来的 MediaWiki 版本中,您将能够在 MCR 虚拟插槽中存储任意的每个修订元数据;现在你必须从头开始,在你自己的表中,在扩展中实现它。或者,如果您认为在不常查看的页面上可以接受延迟,您可以随时进行一些轻量级缓存(使用ObjectCache::getMainWANInstance() 获取WANObjectCache 实例并使用其getWithSetCallback 方法)。

【讨论】:

  • 我只需要一种方法来在页面加载之间存储已解析的 wikitext。最好不要更改数据库。
  • 我对非数据库缓存做了一些扩展。
  • 我阅读了您的更新答案(感谢您的帮助)。这些 WAN 缓存的持久性如何?只需要一个地方在每个页面保存后保存已解析的 wikitext。作为额外的奖励,我什至不需要重新解析 wikitext - 在页面显示之前添加一个钩子并获取结果。
  • 取决于您的 $wgMainCacheType 设置。它们旨在用于 memcached 或 redis 之类的东西(即长期存在但不是永久的,因为旧数据最终将被驱逐以供新数据使用)但完全不同的配置是可能的(例如基于数据库的永久键值存储,或根本没有缓存)。
  • 再想一想,也许可以只使用ParserOutput::setExtensionData来存储解析时的数据,然后依靠解析器缓存存储解析器输出?我对解析器不够熟悉,无法确定这是否可行。
猜你喜欢
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 2015-05-27
  • 1970-01-01
相关资源
最近更新 更多