北京时间今天凌晨 4 点 55 分,据 Flarum 官方社区消息,Flarum 2.0.0-rc.6 正式发布。
这一版合并了 100 多个 PR。和前几个 RC 相比,rc.6 没有把重点放在增加大量显眼的新功能上,而是集中处理了一件事:性能。
简单来说,如果你已经在使用 Flarum 2.0,升级 rc.6 后,即使什么设置都不改,也有机会直接感受到主题打开、页面请求以及后台操作变得更轻快。
而且按照 Flarum 团队目前的计划,如果 rc.6 能够通过接下来真实论坛的检验,它有可能直接成为最终的 Flarum 2.0.0 正式版,而不再修改代码。
这次到底快在哪里?
其中一个最直接的优化发生在打开主题的时候。
之前进入一个主题,前端需要先准备帖子流相关代码,再请求主题数据,然后才能继续请求当前需要显示的帖子,相当于几个步骤串行等待。
rc.6 重新调整了这一过程:在条件允许时,主题信息和当前帖子窗口会同时请求。这样页面不用再把两段网络延迟叠加起来等,帖子也可以更早开始显示。
数据库层面也做了大量类似优化。
例如过去一个页面中如果出现很多用户,Flarum 可能会针对每个用户实例重复查询其用户组权限。现在权限会按照“用户所属的用户组组合”共享缓存。
官方开发者测试中的一个例子里:
group_permission 查询:61 次 → 2 次
- 安装完整扩展集时总查询数:207 次 → 149 次
- 核心加少量扩展时:66 次 → 37 次
除此之外,这一版还减少了帖子、标签、提及、关联数据等多个位置的不必要查询,并提前加载帖子流后续需要的数据。
这些优化单独看可能都不算惊天动地,但叠加在主题列表、主题页面和管理页面这些高频请求上,对真实论坛尤其是安装较多扩展的论坛会更有意义。
开发者以后也更难写出“越用越慢”的扩展了
rc.6 还有一个值得关注的变化:Flarum 的集成测试现在加入了 N+1 查询检测。
所谓 N+1,可以简单理解为:
页面有 50 条数据,程序不是一次把关联数据取出来,而是又针对这 50 条数据分别查询 50 次数据库。
小论坛可能察觉不到,但数据一多就会迅速拖慢页面。
现在 flarum/testing 会分析测试请求产生的 SQL。如果发现查询次数会随着记录数量一起增长,就可以直接让测试失败。
这并不是简单粗暴地看到“重复 SQL”就报错,它还会区分查询参数,避免把正常的少量重复查询误判成 N+1。
而且这套检测刚加入时,就真的抓出了核心和扩展中的实际问题。
所以对于扩展开发者来说,rc.6 的意义不只是“核心更快”,而是以后可以在扩展发布之前就更容易发现这类性能问题。
中文论坛值得特别关注:实验性 CJK 搜索
这一项应该是中文社区最值得单独提出来的变化。
Flarum 终于在核心中加入了一个实验性的 CJK 搜索模式。
Flarum 默认使用数据库全文搜索,而 MySQL / MariaDB 等数据库的默认全文分词方式主要面向使用空格分隔单词的语言。
比如帖子里有:
正常中文用户搜索“中文”,理应能找到它。
但传统全文搜索可能把整串中文当成一个词,导致只输入“中文”反而匹配不到。
rc.6 新增的 CJK 模式会在开启后改用子字符串匹配,并把前端最低搜索长度从 3 个字符降低到 1 个字符。
不过这里要特别强调:
它目前只是一个实验性方案,不是最终的中文搜索解决方案。
对于 MySQL / MariaDB,开启后使用的 LIKE '%关键词%' 无法像全文索引那样有效利用索引,因此数据量非常大的论坛搜索可能会变慢。
所以官方把它设计成:
- 默认关闭;
- 中文、日文、韩文论坛按需开启;
- 大型论坛仍建议考虑 ngram 或未来的独立搜索驱动。
也就是说,这一次至少解决了“默认搜索根本搜不到部分中文词语”的问题,但搜索性能与更完整的 CJK 分词仍有继续完善的空间。
对于中文社区来说,这应该算是 rc.6 最有针对性的新功能之一。
其他一些重要的修复
rc.6 还处理了不少只有论坛长期运行后才容易暴露的问题。
例如:
- 通知邮件现在会正确进入指定邮件队列,不再因为服务启动顺序问题误进默认队列;
- LESS 缓存改进了并发写入处理,降低高并发情况下缓存文件损坏的可能;
- 实时连接断开后重新连接,不会再因为同步问题把主题列表清空;
- 推送过程中断线后可以重新尝试;
- 用户设备时间不准确时,“正在输入”状态不再可能一直卡住;
- 加载主题时保留页面框架,减少页面切换时突然闪空白;
- 修复宽屏布局、页眉空间不足时的重叠问题;
- 调整移动端搜索入口,让返回按钮等操作区域不再受到挤压;
- 修复统计面板的日期范围和上一个周期数据。
如果你的论坛使用 Redis、Horizon、队列、Realtime 等组件,这一批修复其实可能比几个新 UI 功能更值得关注。
还有这些新东西
rc.6 也带来了一些可选功能:
- 队列可以暂停,并增加失败任务管理能力;
- 新增
tinker 命令,可直接进入论坛环境进行交互调试;
- 后台能够检查数据库最低版本和推荐版本;
- 数据库迁移可以隔离执行;
- 主题列表可以按标题排序,标签也能设置自己的默认排序;
- 论坛内部链接可以识别并显示其对应主题;
- 页眉可以开启浅色 / 深色主题切换器;
- 可以统一全站 FontAwesome 图标风格;
- 上面提到的实验性 CJK 搜索模式。
另外还有两项安全方面的加固,包括邮箱值的处理以及访问令牌模型主键类型的问题。
升级 rc.6 要注意什么?
这一次官方特别提醒,建议使用:
composer update -W
而不是只执行普通的 composer update。
因为本周期调整了一些外部依赖,同时提高了 Symfony 的最低版本,-W 可以允许 Composer 一并更新相关依赖。
更新依赖后继续执行:
php flarum migrate
php flarum cache:clear
php flarum assets:publish
仍然建议在升级之前:
- 备份数据库和站点文件;
- 有条件的话先在测试环境升级;
- 检查目前使用的扩展是否已经兼容 Flarum 2.0。
如果扩展比较多,也可以先使用 FoF Upgrade Advisor 检查 PHP、数据库以及已安装扩展的 2.0 兼容情况。
rc.6 会不会就是最终的 Flarum 2.0?
这是这次发布比较特别的一点。
Flarum 团队目前的想法并不是“rc.6 发布以后一定还有 rc.7”。
相反,如果这个版本经过真实论坛运行后没有发现必须阻止正式版发布的问题,rc.6 本身就可能原样成为 Flarum 2.0.0 Stable。
所以现在官方尤其希望已经准备好升级的站长参与实际测试。
真正可能阻止 2.0 发布的,是类似:
- 数据丢失;
- 安全漏洞;
- 升级流程损坏;
- 相比上一版出现严重功能回退;
- 没有合理解决办法的重大问题。
而普通 UI 瑕疵、体验细节或者可以通过 CSS / 扩展绕过的问题,则可能留到 2.0.1 或 2.1 再处理。
换句话说,Flarum 2.0 现在已经不太缺功能了,缺的是足够多真实论坛证明这套代码可以稳定运行。
—
本文只整理了这次更新中对普通站长、中文论坛和扩展开发者比较重要的部分。
想了解所有性能优化、可靠性修复、UI 调整、贡献者名单,以及各项改动对应的 PR,请查看 Flarum 官方发布的 英文原文。
如果你已经升级 rc.6,也欢迎在中文社区分享实际体验,特别是:
- 主题打开速度有没有明显变化;
- 中文搜索模式实际效果如何;
- 现有扩展有没有兼容问题;
- 队列、Realtime、邮件等功能是否正常。
距离 Flarum 2.0 正式版,可能真的只差最后这一轮真实环境测试了。