2026-08-17 · 建站运维
8/16 晚,1dao.cc 家族再添新成员:商城 shop.1dao.cc,基于 CRMEB 开源版(PHP + ThinkPHP 6)。从安装器报「数据库版本太低」开始,一路打怪到 PHP 8.4 全兼容,最后接上 Gitee + walle 自动化部署。这篇记录全程,坑不少,值得存档。
一、起因:为什么是 CRMEB
1dao.cc 站点越来越多:主站、博客、禅道、文件柜、发布平台……商城是补上「电商」这一环。技术选型对比了几家开源商城:
- CRMEB(TP6,PHP):功能全(商品/订单/营销/分销),开源版免费,社区活跃
- 其他几家:要么停更,要么前后端分离太重
之前评估过用 CRMEB 做统一登录授权中心,结论是不可行(缺 OIDC/OAuth2),但作为独立电商完全够用——于是装。
二、安装:PHP 8.4 的硬仗
CRMEB 官方只支持 PHP 7.1-7.4,而服务器是 PHP 8.4。全程约 90% 时间在打兼容补丁:
1. 安装器「数据库版本太低」——是 bug 不是真不兼容
MariaDB 11.8.6 被安装器用字符串比较判成 < 5.1。改掉比较逻辑,继续。
2. SQL 拆分器有分号 bug
安装器按 ; 拆 SQL 文件,数据里的分号把语句拆碎,建表建到一半 500。弃用安装器,手动全量导入:157 张表一次导入成功(顺带处理了 767 字节索引超限,innodb_strict_mode 关掉 + 1 张表改 DYNAMIC 行格式)。
3. PHP 8.4 兼容补丁清单(都在 vendor 里,随代码入库):
- 版本检查:install/index.php、public/index.php 放宽
- 函数签名:
mysqli_connect_errno()去参数、ob_implicit_flush()传 bool、substr_replace()参数转 string - 接口返回类型:TP6 老版本缺 ArrayAccess/JsonSerializable/Iterator 声明,逐个补
- 128 个文件隐式可空参数:
string $x = null→?string $x = null(PHP 8.4 弃用隐式可空,TP 把弃用转成异常直接 500)
4. nginx 伪静态路由坑
try_files ... /index.php?$query_string 内部重定向会把原始 URI 丢掉,导致 /adminapi/*、/api/* 全部路由失败,返回 H5 空壳。换成 TP6 标准写法 rewrite ^(.*)$ /index.php?s=$1 last; 后 API 全部恢复。
三、Gitee + walle 自动化部署
站点跑通后,按 1dao.cc 的统一模式接入部署流水线:
- Gitee 私有仓
ccoad1-crmeb:12,349 个文件入库(vendor 带补丁必须入库),.env/runtime/uploads/安装器全部排除 - 数据目录拆分:
/var/www/crmeb-data独立存.env+ uploads,walle post_release 自动恢复,部署零中断 - walle 首部署踩了两个坑:发布目录 mv 到已存在的手动安装目录会失败(先移走旧代码);walle 的 commit 下拉读的是本地克隆的 git log,新 commit 要先
git fetch才看得到
四、现状与下一步
- 前台 / 后台 / API 全部 200,登录接口验证通过(admin 账号有效)
- 后台登录有滑块验证码,自动化待研究,人工登录无碍
- 下一步:商品上架、支付渠道、后台滑块自动化
至此 1dao.cc 全家桶:主站、博客、禅道、文件柜、导航、凭据库、发布平台、商城——8 个站点,统一 Gitee 私有仓 + walle 部署,一个 git push 一个按钮就能上线。