FlintHub 程序介绍

技术分享 admin积分商城商品 2026-09-08 15:41 9 0
FlintHub 程序介绍

轻量级 PHP 社区系统(论坛 + 博客),基于自研 SplitDB 纯 SQLite 分片引擎

版本:V1.0.0 | 兼容 PHP 8.0.2(SQLite 3.33.0)|

编码:UTF-8 without BOM + LF,用于快速了解本程序的全貌与优势。


一、项目概述

FlintHub(原名 SoSite)是一套轻量级 PHP 社区系统,提供论坛(帖子/回复/版块)、博客、用户中心、后台管理、插件系统等完整能力。它最核心的特点是:彻底剥离 MySQL,全部数据由纯 SQLite 分片引擎(SplitDB)承载,从"单库单表"升级为"分片 + 索引 + 缓存"的架构,在保留 PHP 极简部署优势的同时,解决了大数据量下的性能问题。

说明
项目定位 轻量级 PHP 社区系统(论坛 + 博客一体)
当前版本 FlintHub V1.0.0(由 SoSite 5.0 MySQL 版重构而来)
运行环境 PHP 8.0.2(SQLite 3.33.0),Nginx / Apache / phpstudy 均可
数据引擎 SplitDB —— 纯 SQLite 分片引擎(无任何 MySQL 依赖)
数据规模实测 5 万用户、19.2 万帖、16 万回复、235 万搜索索引行
目录约定 站点根目录为可运行骨架;update/ 为同步镜像 + 全部文档

演进脉络:SoSite 5.0(MySQL 单库)→ 重构为 SoSite 1.0(SplitDB 纯 SQLite 分片引擎)→ 品牌重命名 FlintHub。


二、核心架构:SplitDB 纯 SQLite 分片引擎

2.1 数据分层

data/
├── meta/                        # 元数据层(SQLite 库)
│   ├── business.sqlite          # 非分片业务:用户/版块/设置/博客/私信/附件/标签/投票
│   ├── main_index.sqlite        # 帖子主索引 topic_index(19.2万行) + 回复定位索引 reply_index(16万行)
│   ├── search/                  # 搜索索引季度分文件 search_{YYYYQn}.sqlite(4 文件,235 万行)
│   ├── global_id.sqlite         # 全局 ID 生成器(topic/reply 原子取号游标)
│   ├── sessions.sqlite          # 会话存储(SQLite handler)
│   └── task_queue/queue_{0..2}.sqlite  # 异步任务队列(三队列打散锁竞争)
├── bucket/active/{季度}/{0..31}.sqlite  # 帖子/回复真相源(季度时序 + ID2 哈希分桶)
├── bucket/archive/              # 18 个月以上冷数据归档桶
└── extern/{年}/{季}/{桶}/        # 正文外置:存量 .bin/.idx 偏移索引,新帖 .txt(读取自动回退)

2.2 分片与路由规则(ShardRouter)

  • 一级分区:季度时序分区YYYYQn,如 2026Q3),新数据写入当前季度;
  • 二级分区:哈希分桶(默认 32 桶),写入路由 = ID % 桶数量
  • 读取永远以 main_index.bucket_path 为准,不再二次哈希;未来季度可平滑升级 32 → 64 → 128 桶,历史数据零迁移。

2.3 写入与读取链路

写入 = global_id 原子取号 → 季度分区 + ID2 哈希 → extern 正文原子写(tmp+rename)
     → 桶 topic/reply 真相源 → main_index 索引行(最终一致性,队列可选)
读取 = 列表/分页走 main_index(索引行含 bucket_path)→ 详情读桶 + extern(.bin/.idx 优先,缺失回退 .txt)
搜索 = 自研 bigram 倒排索引(季度分文件,SearchIndexStore)

2.4 引擎关键组件(app/SplitDB/)

组件 职责 亮点
DBFactory SQLite 连接池 单进程 LRU 最大 8 句柄,统一 6 条 PRAGMA(WAL/busy_timeout),禁持久连接
IDGenerator 全局 ID 生成 BEGIN IMMEDIATE 写锁事务原子取号(兼容无 RETURNING 的 SQLite 3.33)
ShardRouter 分片路由 季度 + 哈希双级分区,路径推导唯一依据
ExternStorage 正文外置存储 tmp+rename 原子写;存量 .bin/.idx 偏移索引(fseek 定位,懒加载);编辑后作废 .idx 条目回退 .txt(修复虚拟主机编辑不生效)
Queue / QueueConsumer 异步任务队列 三队列打散锁竞争;CAS 抢占/超时恢复/重试上限;sync/cron/cli 三模式
Schema 初始化与种子 幂等 bootstrap(目录树 + 8 库 + 22 表 + 默认种子)
ViewCounter 浏览计数 APCu 内存计数 + shutdown 批量落库;无 APCu 静默降级为直写 UPDATE(不崩站)
SearchIndexStore 搜索索引 季度分文件存储,与 business 库物理隔离(P21 瘦身 306MB → 19MB)

2.5 事务与一致性

  • 桶写入用原始 SQL exec('BEGIN')/exec('COMMIT');business 库用 beginTransaction()/commit(),二者不混用;
  • 正文外置红线:先原子写 extern → 再写索引行,绝不允许"索引导入成功但正文丢失"(迁移故障注入已验证);
  • 计数延迟合并:统计/浏览数先走内存/APCu 计数,请求结束时批量写回,把写放大钉死在量化边界。

×

友情链接