论坛扛高并发的正确顺序是:先用 Redis 缓存和数据库读写分离把读压力从 MySQL 上移走,再用计划任务把重活从请求链路里挪成异步,最后才考虑横向扩展应用层服务器。顺序颠倒的话,加机器也救不了慢查询,因为瓶颈从来不在 PHP 进程数上。
论坛高并发为什么先加缓存而不是先加服务器?
结论:单机 PHP 的并发瓶颈 90% 出现在数据库读操作上,而不是 PHP 进程数上,所以第一刀要砍在读流量。
一个百万帖级别的论坛,请求分布是典型的“读多写少”:版块列表、帖子列表、帖子详情、榜单、在线人数这些页面占掉绝大多数请求,而它们的结果在 1 分钟内几乎不变。这些内容每次实时查库,就是把 MySQL 当缓存用。
Clara BBS 内置了 Redis / 文件双驱动缓存,在后台「系统工具 → 缓存设置」里可视化开启 Redis,不需要改一行代码。榜单、热点数据、外部接口响应统一走 Cache::remember 一行式调用。两个关键设计要知道:
- Redis 异常时自动降级到文件驱动,缓存层挂了不会拖垮站点,只会变慢。
- 缓存键带表前缀命名空间,多个站共用一个 Redis 实例不会互相覆盖。
开启缓存的判断标准很简单:后台的在线会话表和搜索日志表一旦出现明显的写入延迟,或者容量监控仪表盘里 MySQL 慢查询 TOP 榜出现版块页、帖子页的查询,就先开 Redis 再谈别的。
数据库读写分离怎么配,会不会读到旧数据?
结论:Clara BBS 的读写分离是零侵入的,不配置从库时行为与单库完全一致,配置后 SELECT / SHOW / DESCRIBE / EXPLAIN 自动走从库,写操作走主库。
部署顺序是:先做主从复制,再在配置里挂上从库。三类场景会被强制路由回主库,用来保证一致性:
- 事务内的一切查询;
- 带行锁的查询(
SELECT ... FOR UPDATE);
- 刚写完立刻取自增 ID 的场景。
另外从库连接失败时会静默回退主库并记日志,业务代码零感知。这意味着即使从库临时挂掉,站点也不会报错,只是读压力回到主库。
这一步的收益是线性的:1 主 2 从可以让读能力接近 3 倍。代价是主从延迟带来的“发完帖刷新看不到自己帖子”的观感问题,通常延迟在毫秒级时可接受,如果论坛有大量秒回帖场景,就把帖子详情页的读取固定到主库。
论坛里的“队列”该怎么做?
结论:Clara BBS 不内置独立消息队列组件,异步负载由内置的计划任务体系承担;需要真正的 MQ 时只能自行开发插件接入外部服务。
系统的计划任务用 Cron::register 统一注册,有两种触发方式:
- 前台访问懒触发:零配置,装完就有,适合日活不高、任务不敏感的站;
- 外部
/cron 入口精准触发:流量大的站应该配系统级 crontab 每分钟调用一次 /cron。
并发安全靠文件锁,防止同一个任务被并发重跑;运行结果落库可查,后台能看到每次执行的时间和结果。系统里已经在用这套机制做的事包括 AI 长帖摘要(异步调用 AI 生成一句话摘要,写回 meta description 与帖子页摘要块)、每日容量快照、每日 GEO 健康体检。
判断标准:凡是单次耗时超过 200ms、又不要求用户立刻看到结果的操作(AI 摘要、批量推送、快照统计、清理回收站过期数据),都应该从请求链路挪进计划任务。crontab 的具体写法是 * * * * * curl -s https://你的域名/cron > /dev/null,每分钟一次即可。
横向扩展具体扩哪一层?
结论:应用层可以靠“无状态 + 共享 Redis + 云存储”横向加机器,数据库主库是单点,只能靠读写分离和加配置顶。
横向扩展应用层的前提是三个“共享”:
- 缓存共享:所有机器连同一个 Redis 实例,缓存键已经带表前缀命名空间,多机不会冲突;
- 附件共享:后台「系统设置 → 云存储」把上传文件放到对象存储,不要用本地磁盘,否则多台机器之间看不到彼此的附件;
- 会话共享:会话走 Redis 或共享存储,避免用户在两台机器间被反复踢下线。
做完这三点,前面挂 Nginx 做轮询就能加机器。真正扩不了的是主库,所以主库要先做到“写得尽量少”:能走计划任务的写操作异步化,能加索引的慢查询消灭掉。附件也可以走网盘链接模式,只存链接和提取码不占存储,进一步降低附件表压力。
什么时候该扩容,看什么数据说话?
结论:扩容时机应该由容量监控仪表盘的增速外推决定,而不是等站点卡了再救火。
容量监控插件每天打一次快照,记录帖子数、用户数、附件数、数据库体积、磁盘占用,并给出增长曲线、阈值进度条和按当前增速推算的“多久后需要升级架构”预估。配合 MySQL 慢查询 TOP 榜(需要开启慢日志),可以清楚区分两类问题:数据量增长导致的查询变慢,靠索引和归档解决;并发连接数增长导致的排队,靠从库和缓存解决。
另外后台的「环境体检」一键诊断协议层(HTTPS / HTTP2 / TLS / 域名归一)、缓存层(长缓存 / Brotli / H3 广播)、安全层和运行环境,未通过项会自动生成按当前域名填好的、可直接复制的 Nginx 修复片段——先把协议层的长缓存和 Brotli 打开,这部分收益是免费的。
把这几层按“缓存 → 读写分离 → 异步化 → 横向扩应用层 → 主库升级”的顺序推进,日活数千到数万、帖子百万级的论坛用一台中等配置加一个从库就能稳住;每一步都有后台数据和观测表(在线会话、搜索日志、登录日志、管理日志、审计日志、Cron 运行记录)可以验证效果,不用凭感觉。