最近把 MixPHP 逐步重构到了 V3 版本,之前停更了很长时间,是因为一直在开发 MixGo ,回想起 V2~V2.2 版本中我做了很多尝试,其中特别是 V2.2 我非常激进的直接 all in 单线程协程。
完全独立的模块
以前我开发框架是先构建整体,然后根据框架的需要拆分模块,这导致了模块太多了,有些代码老是感觉放哪里都不太对非常的纠结,各个库之间总是有千丝万缕的联系,独立使用的时候老是连带下载一堆的库。
V3 开始我采用了完全 golang 的那种可插拔的封装思想,我先开发很多个独立的库,这些库的代码尽量的内聚,然后我编写一个骨架,将这些库组合起来使用,我逐步的重构了这些最重要的库。
每个库都是独立可执行的,你可以只使用 mix/vega 来搭配 laravel orm 使用;可以在任意环境中使用 mix/database 和 mix/redis;可以使用 mix/grpc 原生代码编写 gRPC;所有的模块你可以像搭积木一样随意组合。
更多的使用场景,暴露原生接口
在 V1,V2 的时候,我们总是只能在一种固定的进程模式下使用,因为我们这些框架把 swoole 底层封装起来了,因为封装导致原生接口其实是无法暴露出来的,因此都是通过配置的方式来做一些有限的模式切换。
V3 我做的比较彻底,我通过封装的 mix/vega 只在请求事件那里引入框架,完全把原生代码暴露出来,带来了非常灵活的启动方式,可以同时支持:Swoole 多进程同步,多进程协程,单进程协程,WorkerMan 多进程同步,还有 FPM。包含了 CLI 下两大生态的全部执行模式,并且代码完全一致,可以随意切换,这带来了巨大的可选择性,对协程兼容性困扰的用户可以选择同步模式,在 windows 下无法开发的用户可以选择 WorkerMan,FPM 驱动,甚至如果需要 Swow 我都可以接入进来。
数据库组件
这次数据库解决了之前的持有连接导致死锁的问题,同时优化了池的实现,同时废弃了之前复杂的 where 设计,采用的更加简单的 ? 绑定方式,这种方式在 golang 中普通采用。这些改变带来了稳定性和性能的提升,同时更加雅观了,当然还增加了 FPM 的支持,我看到有些用户喜欢单独使用他们。
数据库不管在协程、同步、FPM 执行,代码无需修改,只有在协程时单独调用一下 startPool() 即可。
独立、灵活、性能好
以上,MixPHP V3 带来了很多显著的变化,但依然是一个轻量的高性能框架,现在你可以像使用 symfony 一样独立使用我们的模块了。