mcy-shop(萌次元/异次元店铺系统)是一个纯原生 PHP 写的个人商城/发卡程序:不用 Laravel 也不用 ThinkPHP,底层框架是作者自己造的,只从社区挑个别组件。MIT 协议,约 500+ star。README 开头有段法律声明:程序供学习研究,未取得合法资质不得用于商业销售——它的定位首先是研究用。
是什么
功能面不小:虚拟商品(卡密、账号、充值)和实体商品(带物流查询)都支持;角色分平台、供货商、商家(分站)、顾客四层,分站几乎等同主站,能自己装插件和模板、配置自己的支付接口;插件类型覆盖控制器、管理菜单、控制台命令、常驻进程、WebSocket、支付、发货、HOOK 钩子和模板;带 i18n,仓库 config/language 下有十几个语言的 JSON 语言包。没做到的:仓库里没有具体支付通道实现,kernel 只有支付插件的抽象层,通道以插件形式另行分发;安装步骤 README 也没写,只指向项目自有文档站。
技术栈与部署
composer.json 声明 php >= 8.1,README 徽标标注 MySQL 5.6+;要装的扩展有 json、openssl、gd、zip、curl、pdo、bcmath。第三方库是精挑的几件:ORM 用 hyperf/database 3.0.23(只取 Hyperf 的数据库组件,不装整个框架),分页 hyperf/paginator、事件 hyperf/event,模板引擎用 Symfony 团队的 twig 3.14,HTTP 走 guzzle,邮件 phpmailer,用户输入内容过滤用 htmlpurifier。目录结构:app 下 Controller/Model/Service/Entity/Validator/View 分层,kernel 是框架本体(依赖注入容器、注解、插件系统),入口 index.php。它支持 FPM 和 CLI 两种跑法,仓库带 bin 和 dev.sh,开发时:
composer install # README 未明写,按 composer.json 推断,得自己试
./dev.sh start # 读 config/server.php 的 name/port,循环拉起 ./bin index.php dev
./console.sh ... # 即 ./bin index.php console,跑命令行任务
值得抄的三点
一、自研框架的边界感。kernel 里真正自造的是 DI 容器加注解注入(支付抽象类里一个 #[Inject] 就把请求、响应、订单服务塞进来)、路由与插件装载;而 ORM 和模板这两个最难写好的部分直接买现成的。对常年跑在虚拟主机和低配 VPS 上的发卡程序,这套的体积和依赖比整包装 Laravel 轻一个量级,README 声称能配合负载均衡处理很高并发——数值未实测,思路可参考。
二、支付插件做成两分钟的接口。kernel/Plugin/Handle/Pay.php 定义的接口只有两个方法:create() 创建支付单返回统一实体,async() 处理异步通知;抽象类里再收敛一个 successful()——支付确认后统一调 orderService->deliver() 触发发货、写支付状态和时间。新增一个通道只需要实现这三板斧,订单和库存逻辑一行不动。
三、发货和商品解耦。Ship、ForeignShip 抽象类单列,虚拟卡密、游戏账号、实物物流是不同发货插件;配合「分站即主站」的租户模型,商家自己装发货和支付插件,主站不为每个商家的通道写分支。多租户不做代码隔离层,用插件安装行为隔离,这个取舍值得琢磨。
别踩的坑
一、vendor 目录和 composer.phar 整个提交进仓库(文件树里约三千个文件),升级依赖是整目录替换;自己改过 composer.json 再合并上游更新时容易互相覆盖,动手前先在本地理一遍 git 状态。
二、README 宣称全站 API 二进制 AES 加密通讯,前台接口拿明文 curl 是调不通的,二次开发对接外部系统要先读懂它的加解密层,细节 README 没写,得自己读代码试。
三、dev.sh 是 while true 的一秒轮询拉起循环,调试时改崩了进程会反复重启,找不到「进程杀不掉」的原因时先来看这个脚本。另外演示站账号是公开的,别在上面做改数据的试验。
许可证
MIT:可修改、可并入闭源项目,保留版权声明和许可文本即可。作者额外在 README 写了法律声明要求依法使用,声明不是许可证条款的一部分,但既然白纸黑字,用它做研究前值得一读。

















暂无评论内容