先说结论
技术选型的本质是"放弃"。我选 CodeIgniter 4 + MySQL 单库,放弃了队列、微服务、SPA,换来的是:客户在任何一台普通 LNMP 机器上都能跑。
为什么是 CI4
| 候选 | 优势 | 放弃原因 |
|---|---|---|
| Laravel | 生态最全 | 对共享主机/低配 VPS 偏重,客户环境不可控 |
| Symfony | 架构严谨 | 学习与维护成本高,一个人扛不住 |
| WordPress | 上手快 | 多语言要靠插件,改不到"翻译队列"这一层 |
| CI4 | 轻、PSR 规范、文档够用 | 生态小,很多轮子要自己写 |
关键约束:交付给客户后,我没有服务器权限。所以框架必须能在 PHP 8.2 标准环境跑,不依赖 Redis、队列、Supervisor。
单库的理由
- 备份简单:一个 SQL 文件 + uploads 目录
- 事务简单:不用考虑跨库一致性
- 迁移简单:客户换服务器就是导库 + 拷文件
代价是数据量上限低。按当前内容模型,单库支撑几十万条内容没问题。
放弃的东西
- 队列:翻译任务用数据库状态机(pending/failed/done),不用 Redis
- 微服务:翻译服务中心是独立进程,但通过 HTTP 同步调用 + 重试,不做消息总线
- SPA:后台用服务端渲染 + Alpine.js,首屏快、无构建依赖
- 多租户:一站一部署,不做 SaaS
得到的性质
- 部署 = 上传 + 装库 + 跑向导,30 分钟
- 升级 = 覆盖文件 + 跑迁移
- 排障 = 看日志文件,不需要分布式追踪
对"一个人维护、卖给中小企业"这个场景,这些性质比技术先进性重要得多。
2C4G 机器上,首页 100 并发 P95 约 200ms,500 并发开始出现排队。放弃的具体方案是 Laravel + Redis 队列:客户环境经常没有 Redis,装不上就等于系统不可用。