V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
onanying
V2EX  ›  PHP

我为什么要开发一个 MixPHP 框架

  •  
  •   onanying · 2017-10-11 18:17:57 +08:00 · 10523 次点击
    这是一个创建于 2634 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近业余时间一直在开发 ExpressPHP 的第二个版本 MixPHP,今天下班想起之前一个面试官的问题:你为什么还要再造一个轮子呢?仔细回想,第一个版本,现在想来确实 “炫技” 的成份比较多,现在推翻第一版,又重构一个所谓的 “全功能 PHP 框架” ,这东西又不赚钱,我到底为了啥?其实,写程序和写诗有很多相似之处,同样需要优雅的语法,好作品也同样想要有更多的人欣赏,感性完了,接下来理性的分析一下。

    国内常用的框架

    国内较流行的 PHP 框架,参考 Lagou 等招聘网中的招聘信息与众多同事口口相传。

    ThinkPHP: 易上手,文档友好、过度封装
    Yii: 安全性高、规范、性能稍差
    Codeigniter: 简单、高效、文档友好
    Yaf/Phalcon: C 扩展,高性能

    后端开发业务场景

    通常后端开发有以下这些场景:

    • 网页 /后台管理开发
    • API 开发
    • TCP 服务器开发
    • UDP 服务器开发
    • 异步队列消费者开发
    • 定时任务开发

    采用多种技术,复杂度、成本必然更高

    因为不同场景的诉求不同,所以很多公司采用多种框架来开发,APP 的 API 采用 Yaf/Phalcon,后台管理采用 Yii、ThinkPHP、Codeigniter,TCP/UDP 服务器又采用 Java/C++来写,一个后端开发就需招聘擅长不同框架不同语言的程序员来开发。

    现有 MVC 框架的弱项

    在网页 /后台管理 /API 开发方面,流行的各种 PHP 框架一直都很擅长,可是在控制台程序开发方面:

    • HTTP/TCP/UDP 服务器开发:还未有流行的 PHP 框架封装。
    • 异步队列消费者开发:只提供了 CLI 模式下运行控制器方法,并未提供主进程多子进程的进程模型,并未提供多线程处理。
    • 定时任务开发:还需依赖第三方工具 crontab 等,PHP 框架本身不能实现。

    PHP 框架开发效率与性能不可兼得

    Yaf/Phalcon 这样 C 扩展框架,如果开发业务十分复杂的后台与网页,开发效率不高,中小企业开发效率才是生存王道,而开发效率高的 ThinkPHP、Yii、Codeigniter 开发 API 性能又差了点,当然性能可以从架构上着手,但是如果高性能与开发效率可以兼得,岂不更好。

    MixPHP 试图解决这些

    • 高性能与开发效率兼得:参考 Yii、ThinkPHP、Codeigniter 提高开发效率的特性,编写全部面向对象的 MVC 框架,使其同时支持 LNMP 架构与 Swoole 应用服务器,需要开发效率时采用 LNMP 传统架构,需要高性能 API 时,修改少量代码,即可切换为 Swoole 应用服务器,把框架类库预加载至内存,数据库按进程长连接,可达到 Yaf/Phalcon 的性能。
    • 多线程异步队列服务:只需写好控制器方法,然后在配置文件中配置下路由命名空间、进程、线程数量,就可在 CLI 模式中启动多进程多线程模型的异步队列处理程序。
    • 定时任务服务:只需写好控制器方法,然后配置下路由命名空间、定时循环条件,就可在 CLI 模式中启动动态多进程模型的定时任务处理程序。
    • TCP/UDP 服务:一步步来,后续版本再考虑加入。

    结尾

    许愿:希望以后所有后端开发,如用 PHP,就用一个框架可好?

    GitHub

    支持的用户请加个 Star 吧,让更多人发现 MixPHP。 https://github.com/mixstart/mixphp

    56 条回复    2018-04-24 18:26:07 +08:00
    onanying
        1
    onanying  
    OP
       2017-10-11 18:26:27 +08:00
    为啥没人发表下评论?
    WuwuGin
        2
    WuwuGin  
       2017-10-11 18:28:18 +08:00 via Android
    我觉得造轮子本来就是多元化的体现,而且能更好理解一些之前模棱两可的概念。要是每个人都去搞未实现的事物的话,为什么现在人类还没有统治银河系😌。所以说造轮子是为了积累沉淀技术,我觉得没毛病。
    onanying
        3
    onanying  
    OP
       2017-10-11 18:33:44 +08:00
    @WuwuGin 要不要体验一下我造的这个轮子?
    WuwuGin
        4
    WuwuGin  
       2017-10-11 18:35:38 +08:00 via Android
    @onanying 我现在在用 yii2,等有空可以试试新轮子。
    onanying
        5
    onanying  
    OP
       2017-10-11 18:42:50 +08:00
    @WuwuGin 我这个框架有很多设计要借鉴了 Yii2,组件、模型、路由等。
    runningman
        6
    runningman  
       2017-10-11 20:35:50 +08:00
    可以加个微信交流 27011861
    runningman
        7
    runningman  
       2017-10-11 20:58:44 +08:00
    写错了。微信 270115861.
    wu1990
        8
    wu1990  
       2017-10-11 21:10:29 +08:00
    依赖 swoole,我想问数据库操作是异步的吗?不是用 swoole 的协程,也没有 yield,看着不像异步的,性能和原生 php 应该差不多
    onanying
        9
    onanying  
    OP
       2017-10-11 21:35:25 +08:00
    @wu1990 没有使用异步,暂时也不打算引入异步,后续会加入,性能比原生 PHP 要好,但是比 Apache/PHP-FPM 传统框架,比如:Yii/TP/CI 纯 PHP 框架,Yaf/Phalcon 这些的 C 扩展框架,都要好太多,具体对比测试: http://www.jianshu.com/p/f769b6be1caf。
    onanying
        10
    onanying  
    OP
       2017-10-11 21:36:25 +08:00
    @runningman 你可以进官方群。
    onanying
        11
    onanying  
    OP
       2017-10-11 21:39:39 +08:00
    MixPHP 并发性能全面对比测试: http://www.jianshu.com/p/f769b6be1caf
    v2ex 还能更蠢一点么,句号都加入 href
    sexrobot
        12
    sexrobot  
       2017-10-11 21:52:46 +08:00
    看到 yii 风格的 namespace 有些反感
    onanying
        13
    onanying  
    OP
       2017-10-11 21:56:22 +08:00
    @sexrobot 哈哈,底层还是不一样的,好的思想借鉴一下啦。
    vincenth520
        14
    vincenth520  
       2017-10-12 09:22:29 +08:00
    看设计风格这些感觉跟 zanphp 很像
    DukeAnn
        15
    DukeAnn  
       2017-10-12 09:30:32 +08:00
    这种自己开发的小众轮子多半不会有公司用,只能自己或者自己公司内部用
    onanying
        16
    onanying  
    OP
       2017-10-12 09:34:55 +08:00
    @vincenth520 zanphp,tencent-tsf 这些都是大量使用异步携程的框架,mixphp 更像是处于 zanphp 与 Phalcon 之间的位置。
    onanying
        17
    onanying  
    OP
       2017-10-12 09:36:40 +08:00
    @DukeAnn 技术爆炸的时代,小众轮子确实多半不会有公司用,你说的非常对,以后我路过的公司,我自己用吧,哈哈
    Norie
        18
    Norie  
       2017-10-12 10:15:43 +08:00
    膜拜
    kancloud
        19
    kancloud  
       2017-10-12 14:04:50 +08:00
    没有细看,为手册放看云点个赞👍
    onanying
        20
    onanying  
    OP
       2017-10-12 14:22:05 +08:00
    @kancloud 看云还是很好的,现在 gitbook 网速差的一逼。
    flyshu
        21
    flyshu  
       2017-10-12 14:46:52 +08:00
    赞一个
    Immortal
        22
    Immortal  
       2017-10-12 15:14:31 +08:00
    首先楼主轮子精神值得敬佩
    但是我觉得性能测试上有一些不严谨
    项目我没仔细看,但貌似是基于 swoole 的一个框架
    在性能对比里因为你的框架是基于 swoole 的,所以和其他框架对比的时候也应该在 swoole 上比较
    比如 mixphp 对比 yii2 的时候,yii2 应该也在 swoole 上
    不然你无法判断你的高性能是你的框架性能好,还是 swoole 的功劳
    sagaxu
        23
    sagaxu  
       2017-10-12 15:25:07 +08:00
    TCP/UDP 服务器可以用 swoole 啊,或者用 Go 也是很自然的,不一定要招不同的人做

    laravel/yii 做管理后台,swoole 做服务端,性能扛不住了再引入 Go 或者 Java,再造一个小众框架,不看好
    onanying
        24
    onanying  
    OP
       2017-10-12 15:30:45 +08:00
    @Immortal 可能你还没有深入了解 Swoole,Swoole 有很多领域与使用方法,而我使用的是 SwooleHttpServer 这一块,而这一块的话,最大的优势就是:因为是 CLI,request/response 变为了事件,从而允许对象常驻内存,而 Yii 这类的框架是以 Apache/PHP-FPM 方式为基础的,无法在 Swoole 里常驻运行,当然应该如果有人去特殊处理一下,应该也可能,不过我没有这方面的经验,而如果不使用常驻运行,包含代码与执行框架全放在 request 事件里,那这样的运行方式与 PHP-FPM 的多进程模型,没有什么差别,而 MixPHP 从设计开始就是以常驻内存的方式设计的,也考虑了 SwooleHttpServer 内运行多个 HOST 的问题,还有 session,PHP 自带的 Session 无法在 CLI 下运行,这就导致了基于 PHP Session 封装的框架都无法运行,Session 做自己定制一下,还有全局变量问题,传统框架搭设在 SwooleHttpServer 面临很多问题,实际上无法真接运行的,大部分人是把 Swoole 使用在 传统框架内,当 client 端使用。
    onanying
        25
    onanying  
    OP
       2017-10-12 15:33:36 +08:00
    @sagaxu 哈哈,我自己也不看好,留着自己用。
    onanying
        26
    onanying  
    OP
       2017-10-12 15:40:17 +08:00
    @sagaxu 我这个就是基于 Swoole 的呀,你们用 Swoole 不封装一下么? 直接写原生?还是使用韩天峰老大做的那个?
    sagaxu
        27
    sagaxu  
       2017-10-12 15:46:11 +08:00
    @onanying swoole 除了 C 扩展还有一个框架,我们就用那个,而且定制了 rpc 协议,业务逻辑的入口已经不是 HTTP 的了,也没有 cookie 或者 session 的概念,只有一个 token
    Sukizen
        29
    Sukizen  
       2017-10-12 15:58:12 +08:00
    同样是轮子,超跑的轮子和普通汽车的轮子肯定又不一样的地方。
    所以我欣赏造轮子的人,至少他能造。

    虽然没用过楼主的轮子,但是真心是赞。
    onanying
        30
    onanying  
    OP
       2017-10-12 16:01:57 +08:00
    @Sukizen 感谢!我差点被口水淹没了,5555
    Immortal
        31
    Immortal  
       2017-10-12 16:07:48 +08:00
    @onanying 因为早期我看过别人的 yaf+swoole 整合 你说的对 直接使用是不行 自己处理后是可以的 现在的 laravel+swoole 的整合我也见过好多了 只是我自己觉得你这样和 apache 之类的 server 做测试不是很严谨
    hhacker
        32
    hhacker  
       2017-10-12 16:09:20 +08:00   ❤️ 1
    已 star,我一直不支持”为何要重复造轮子“这种观点,尤其是程序员都有不服输的精神,”我写的肯定好用“,我觉得正是这种永于造轮子的精神,才使得一代一代的程序员不断成长,不甘平庸,活得精彩,就像写一首诗,有人欣赏固然好,没人欣赏独乐乐有何不可
    sagaxu
        33
    sagaxu  
       2017-10-12 16:12:03 +08:00
    @onanying 就是官方这个框架。你的测试是虚拟机吗?感觉有点低。4 核 CPU,RPS 至少得 10K 以上吧,1000 多不正常。
    onanying
        34
    onanying  
    OP
       2017-10-12 16:12:54 +08:00
    @sagaxu 虚拟机,还开着 N 多软件
    onanying
        35
    onanying  
    OP
       2017-10-12 16:14:18 +08:00
    @Immortal 这样吧,因为 MixPHP 也支持 Apache/PHP-FPM 运行,后面我有时间了再加上 Apache 上执行与 Yii2 的对比,希望你能关注。
    sagaxu
        36
    sagaxu  
       2017-10-12 16:14:59 +08:00
    @hhacker 99%以上的轮子都是椭圆的甚至方的,作为练手有其价值,用到项目里,那是坑公司和同事
    sagaxu
        37
    sagaxu  
       2017-10-12 16:18:30 +08:00
    @onanying 这样很影响 benchmark 效果的,最好真机给足内存,关掉不相关软件再测
    Immortal
        38
    Immortal  
       2017-10-12 16:41:50 +08:00
    onanying
        39
    onanying  
    OP
       2017-10-12 16:56:46 +08:00
    @sagaxu 其实我面试的公司也有一些是公司自己定制的框架,也不能说是坑吧,看决策者注重哪一方面,有些企业决策者注重长远考虑,加上业务形态的特殊性,就决定自己做轮子了。
    hhacker
        40
    hhacker  
       2017-10-12 17:05:31 +08:00
    @sagaxu
    能在公事上选用自己写的轮子,都是在技术团队里处于技术负责或者带头的了,尤其是框架这种涉及到大方向的,这责任可不小,并且一个东西从最初的 alpha,到 beta,再到 rc 到 release,经历的时间都是相当长,需要相当多的受众和使用者踩坑,最终出来的才是 stable 版本,一个开源项目能最终到达 stable 状态的话,用在公司项目上当然是可以接受的。
    sagaxu
        41
    sagaxu  
       2017-10-12 19:55:36 +08:00
    @onanying 很多公司一个部门内部就有几组不同框架和不同程度的轮子,每个选型的人都有理有据,都觉得自己业务特殊,实际上很多时候把他们的框架互换,可能也没多少不利的影响。如果公司可以养 3 个以上只做基础设施不碰业务的平台开发人员,造一些轮子也无碍,不舍得养的话,另造轮子很可能得不偿失。

    @hhacker 问题是资深或者高级开发,出发点不是公司利益,而是自身利益,力排众议用自己的轮子,成了可以写晋升 PPT,可以巩固自己专家地位,搞砸了大步了跑路换个公司继续坑。空降 CTO,然后全盘重构的例子多了,有多少不是政治因素,单纯技术决定的重构,只有当事人们自己清楚了。

    我们公司在 PHP 技术积累上国内排前 5 应该没问题,就在这周还有好多次 coredump,一路踩过无数的坑,十次里面九次是自造轮子引起的,我们是因为每天几十亿次请求,没法选择那些用户基数大比较 stable 的 PHP 框架。
    ylsc633
        42
    ylsc633  
       2017-10-12 20:00:51 +08:00
    先膜拜一下大佬

    将来有这能力,我也会造一下轮子...

    不过.. 有一点..
    如果你只是路过某个公司,在没有必要的情况下,求不坑其他同事,特别是你走后来的同事......
    AlwaysBee
        43
    AlwaysBee  
       2017-10-12 20:25:19 +08:00
    支持,虽然不赚钱,但是我觉得收获都是潜在的,刚刚也分享了一篇关于自己是如何通过免费的产品给自己引流的文章,写得不好,多多指教

    https://mp.weixin.qq.com/s/k5HGT5p17f_h_NGS47D1bA
    linxl
        44
    linxl  
       2017-10-13 09:10:37 +08:00
    自己当大佬给大家用, 哈哈哈
    vincenth520
        45
    vincenth520  
       2017-10-13 14:04:10 +08:00
    这个框架已经在微博上被韩天峰跟鸟哥议论了
    onanying
        46
    onanying  
    OP
       2017-10-13 17:43:56 +08:00
    @Immortal 已经加上 Apache 下与 Yii/CI 的对比测试,请查看,有时间你也可以自己测试一下。
    onanying
        47
    onanying  
    OP
       2017-10-13 17:55:42 +08:00
    @vincenth520 感谢两位 PHP 界的大神对我这个小众框架的关注。
    pushaowei0727
        48
    pushaowei0727  
       2017-10-19 14:21:07 +08:00
    ```
    但是比 Apache/PHP-FPM 传统框架,比如:Yii/TP/CI 纯 PHP 框架,Yaf/Phalcon 这些的 C 扩展框架,都要好太多
    ```
    本人一直用 Yaf/Phalcon 3 年有余, 看到这儿立马打算看一看,然后看了你的测试地址发现 404,不知道是怎样测试,然后点进项目里面,呃
    onanying
        49
    onanying  
    OP
       2017-10-19 20:10:14 +08:00
    @pushaowei0727 测试地址: http://www.jianshu.com/p/f769b6be1caf ,你可以安装一个测试一下,毕竟大家都带有主观思想。
    gouchaoer
        50
    gouchaoer  
       2017-10-19 21:58:07 +08:00 via Android
    https://github.com/mixstart/mixphp/issues/2

    我错了么?


    另外那个 benchmark 没有意义,你往逻辑里加点 redis/mysql 看看 qps
    gouchaoer
        51
    gouchaoer  
       2017-10-19 22:04:26 +08:00 via Android
    对了,在再渲染输出几十 kb 的 html 试试,同步阻塞的框架优化的再好也只是框架本身逻辑优化,这一块除非你像 laravel 那样自己把自己搞得很慢很复杂,否则放到实际业务里差别真不大
    onanying
        52
    onanying  
    OP
       2017-10-20 11:59:29 +08:00
    @gouchaoer MixPHP 与 Phalcon 数据库并发性能测试 http://www.jianshu.com/p/0ce1a9885e01 , 你低估了框架本身对性能的损耗。
    onanying
        53
    onanying  
    OP
       2017-10-20 12:00:39 +08:00
    @gouchaoer 而且可能也低估了常驻内存带来的性能优势。
    fenghoer
        54
    fenghoer  
       2018-03-14 13:48:46 +08:00
    swoole 模式下,可以支持热更新吗。还有:长期运行的话稳定性怎么样呢
    tangniyuqi
        55
    tangniyuqi  
       2018-04-24 18:24:51 +08:00
    赞一个! php MVC 行业需要你来拯救
    tangniyuqi
        56
    tangniyuqi  
       2018-04-24 18:26:07 +08:00
    建议多加入 yii2 等优秀框架的开发特性
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2721 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 11:52 · PVG 19:52 · LAX 03:52 · JFK 06:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.