一个家族网站十余年的技术演进
缘起
桂阳吴氏族谱系统最早建于 2015 年,采用当时主流的 ASP(Active Server Pages)技术构建,运行在 Windows Server + IIS 环境下。系统承载着数万条家族成员数据,包括世系关系、字辈排行、房次分布、居住地信息等,是族人寻根问祖、查阅族谱的重要平台。
然而,技术在进步。ASP 技术早已停止更新,运行环境的安全补丁日益稀缺,维护成本越来越高。与此同时,PHP 生态系统蓬勃发展,拥有丰富的开源资源、活跃的社区支持和现代化的开发工具。将宗谱系统从 ASP 迁移到 PHP,成为一项必要而紧迫的任务。
迁移目标
这次迁移不只是更换一门编程语言,而是对整个系统进行全面升级:
- 技术栈现代化 — 从 ASP 切换到 PHP 8.x,使用 PDO 数据库访问层,告别过时的 ADODB
- 用户体验提升 — 全面适配移动端,优化界面交互
- 功能增强 — 新增微信分享、扫码登录、地图展示等功能
- 安全加固 — 引入身份验证、权限管理、操作日志等安全机制
- URL 兼容 — 保留旧版 ASP 链接的可访问性,确保老用户书签不失效
迁移路线
第一阶段:数据层迁移
数据库从 Access (MDB) 迁移到 MySQL(InnoDB),字符集统一为 utf8mb4,彻底解决中文乱码问题。数据表结构也做了优化:
family_members— 家族成员主表,增加索引优化查询性能generations— 字辈表,映射辈分名称与世代编号relationship— 关系定义表,规范配偶、子女等称谓admins— 管理员表,支持多级权限
第二阶段:业务逻辑重写
将 ASP 页面逐一用 PHP 重写,核心功能包括:
| 功能 | 旧版 ASP | 新版 PHP |
|---|---|---|
| 成员查询 | biao.asp | database.php |
| 世系树图 | ztree.asp | tree.php |
| 成员详情 | member.asp | member_detail.php |
| 统计看板 | — | stats.php |
| 字辈排行诗 | — | ph.php |
| 大事记 | — | events.php |
| 管理后台 | admin_* | admin/ |
其中统计看板、字辈排行诗、大事记等页面是迁移过程中新增的功能,旧版 ASP 中并未实现。
第三阶段:旧版 URL 兼容
这是一个容易被忽视但实际很重要的环节。许多老用户保存了旧版 ASP 链接的书签,各种外站引用也指向旧地址。我们通过 IIS URL Rewrite 实现了无缝跳转:
http://wu.hn.cn/wu/function_login.asp → https://wu.hn.cn/gywu/login.php
http://wu.hn.cn/wu/*.asp → https://wu.hn.cn/gywu/
同时保留了原始 ASP 登录入口的兼容:function_login.asp?loginname=xxx&loginpwd=xxx 这种老式参数传递方式,通过 Rewrite 规则自动映射到新的 PHP 登录页。
第四阶段:新增功能
迁移过程中,我们利用 PHP 生态的优势,为系统增加了许多新能力:
微信分享
借助微信 JS-SDK,实现了朋友圈带图分享功能。管理员可以在后台配置分享标题、描述和图片,族人在微信中打开网站时,右上角「分享到朋友圈」即可显示自定义内容。技术细节上,需要获取微信 access_token 和 jsapi_ticket,生成签名并配置 wx.config,整个过程通过 PHP 在服务端完成签名,前端只在微信浏览器中加载 SDK。
宗村地图
基于腾讯地图 API,在地图上标注各宗村的地理位置,支持缩放、点击查看详情,并在移动端自动折叠侧栏以最大化地图显示区域。地图加载完成后自动调整视野,将所有标记点恰好显示在可视区域内。
微信扫码登录
族人可以使用微信扫码登录后台,无需每次输入账号密码。后台管理界面还加入了弱密码提醒和微信绑定引导,提升账户安全性。
响应式设计
所有页面均针对手机端做了适配:
- 统计看板 — 世代分布图在手机端可横向滑动,数据最高的柱子自动居中显示
- 字辈排行诗 — 宣纸卷轴风格,手机端由竖排文字自适应为横排显示
- 数据库列表 — 10 列数据在手机端通过水平滚动完整呈现,分页栏固定不动
- 导航菜单 — 汉堡菜单 + 下拉式管理菜单,兼容微信内置浏览器
技术架构
迁移后的系统架构如下:
用户 → HTTPS → IIS (URL Rewrite) → PHP 8.x (FastCGI)
↓
MySQL 8.0 (InnoDB, utf8mb4)
↓
┌─────────────┐
│ 核心功能模块 │
│ 成员管理 · 世系查询 │
│ 统计看板 · 数据导出 │
│ 管理后台 · 权限控制 │
└─────────────┘
├────────────── 扩展功能 ──────────────┤
微信分享(JS-SDK) · 腾讯地图 · 扫码登录
关键决策点:
- 框架选择:未使用重量级框架,采用轻量级 PHP + 面向过程方式,保持代码简洁且与旧系统的思维模型接近,降低维护门槛
- 数据库访问:统一使用 PDO 预处理语句,杜绝 SQL 注入风险
- 页面模板:PHP 原生模板 + 独立 CSS 文件,header/footer 分离复用
- 配置管理:
site_config表实现动态配置,支持在后台随时修改
迁移中的挑战
1. ASP 与 PHP 差异
ASP 使用 VBScript,PHP 使用类 C 语法,两者在字符串处理、数组操作、数据库访问方式上差异巨大。例如 ASP 的 RecordSet 需要改写为 PHP 的 PDOStatement,ASP 的 Session 用法需要适配 PHP 的 Session 机制。
2. 字符编码
旧 ASP 系统使用 GB2312/GBK 编码,迁移到 UTF-8 过程中出现了部分数据乱码。通过在 MySQL 连接时设置 SET NAMES utf8mb4,并从应用层统一输出 UTF-8 编码头,最终解决了这一问题。
3. 反向代理环境
网站部署在 IIS 反向代理后面,$_SERVER 中的 HTTP_HOST 和 HTTPS 等变量未能正确反映客户端请求的原始信息。解决方案是定义 SITE_URL 常量并基于它构建所有 URL,避开对服务器变量的依赖。
4. 微信生态适配
微信浏览器对页面的加载有特殊行为,例如 iOS 微信中页面底部有工具栏遮挡、Android 微信中页面缩放可能导致布局异常。我们通过 viewport 设置、CSS 媒体查询和 JavaScript 动态调整来逐项解决。
效果与反馈
迁移完成后,系统在以下方面有了显著改善:
- 页面加载速度:PHP 8.x + MySQL 8.0 的组合比旧 ASP + Access 快了 3-5 倍
- 移动端体验:手机访问不再是痛苦的缩放操作,所有页面均可流畅浏览
- 可维护性:代码结构清晰,注释完整,后续功能扩展更加便捷
- 安全性:SQL 注入防御、XSS 过滤、密码哈希存储、操作日志记录一应俱全
一些技术心得
这次迁移让我深刻体会到几个道理:
-
兼容旧链接是尊重用户。不要因为技术升级就抛弃老用户,他们的书签和外链都是宝贵的积累。IIS URL Rewrite 让这件事变得简单。
-
渐进式迁移优于大爆炸式重写。先迁移核心功能上线,再逐步完善新功能,比一次性全部重写更稳妥。
-
移动端不是可选项。今天超过 60% 的访问来自手机,响应式设计必须从一开始就纳入规划。
-
微信生态不可忽视。对于面向中国用户的网站,微信分享、扫码登录等能力是刚需,而不是锦上添花。
下一步计划
迁移到 PHP 只是一个新的起点,后续还有很多可以探索的方向:
- 族谱数据可视化,用图表展示家族繁衍趋势
- 在线编辑谱牒,族人可自助提交修正信息
- 家族通讯录,方便族人之间的联系
- AI 辅助寻根,基于数据匹配帮助失散的族人找到归属
桂阳吴氏宗谱系统自建立以来,历经十余年风雨。从 ASP 到 PHP,变的是技术,不变的是为族人服务的初心。如果你也是家族网站的管理员,希望这篇文章能给你一些参考。
注:此文章由AI自动生成









发表评论