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

PHP 框架 QueryPHP 1.0 正式版,四年打磨生产可用!

  •  
  •   doyouhaobaby · 2020-07-24 13:39:37 +08:00 · 3978 次点击
    这是一个创建于 1585 天前的主题,其中的信息可能已经有所发展或是发生改变。

    [开源新闻] https://www.oschina.net/news/117377/queryphp-1-0-released

    今天是一个非常特殊的日期,在这里我们将向大家宣布一个重要的消息,完全重写的 QueryPHP 1.0 正式版发布了!

    关于 QueryPHP

    QueryPHP 是一款现代化的高性能 PHP 渐进式协程框架, 我们还是主要面向传统 PHP-FPM 场景,以工程师用户体验为历史使命,让每一个 PHP 应用都有一个好框架。

    百分之百单元测试覆盖直面 Bug,致力于创造高品质产品 Level Level Leevel,依托 Swoole 开启未来更多可能,此刻未来逐步渐进。 我们的愿景是USE LEEVEL WITH SWOOLE DO BETTER, 让您的业务撑起更多的用户服务。

    特性

    • Production-Ready (生产可用)

    • 框架理念 (值得托付的使命感,让每一个 PHP 应用都有一个好框架。)

    • 组件系统 (框架底层由独立的高内聚低耦合组件构成,可以轻松无侵入接入现有系统。)

    • 路由系统 (框架提供 MVC 自动路由并能够智能解析 Restful 请求和基于 OpenApi 3.0 规范的 swagger-php 注解路由,文档路由一步搞定。)

    • 整体解决方案 (框架提供了从缓存、Session 、IOC 容器、模板引擎、Ddd ORM 等大量开箱即用的功能,提供了基于 Symfony Console 命令行工具集。)

    • 高品质 (百分之百单元测试覆盖直面 Bug,致力于创造高品质产品 Level Level Leevel 。)

    • 业务协程化 (基于 Swoole 4 开发,我们的愿景是少量代码或者无修改,让你的业务撑起更多的用户服务。)

    • 百分之百单元测试覆盖(超过 3500 例测试用例保证系统可靠性和可持续维护。)

    • PHP 7 严格模式 (每一个 PHP 脚本都是 strict_types=1,严格模式可以避免很多弱类型带来潜在 BUG 。)

    • PHP 7 类型提示 (尽可能为每一个方法提供确定的参数类型和返回值类型,以及类属性的类型支持。)

    • 依赖注入(完整实现,关键 MVC 、命令行脚本、事件监听器全部接入 IOC 容器。)

    • 领域驱动设计(支持 UnitOfWork 事务工作单元、Repository 仓储、Specification 查询规约,Entity Getter Setter 领域实体等。)

    • 避免闭门造车 (QueryPHP 一直从 Laravel 、Symfony 等框架吸收一些优秀的设计,同时我们自身也进行了大量的创新设计。)

    • 更多的特性期待你的发现...

    缘起

    在发布 QueryPHP 前,早在 2010 年 10 月便去尝试发布了一个开源框架 DoYouHaoBaby,但是代码早期的用户体验和质量都非常的不理想。在后来基于这个框架去做了一些应用如 DYHB.BLOG 和社区 WindsForce,事实上框架的一些 BUG 和设计都是通过这些具体的应用来验证的,后来的故事就是全部停止开发。

    缘灭

    2013 年 11 月开始了第一份工作上班了,慢慢地时间也少了,也很少再有多少心情去做一些业余的项目了。后来就是心里只留下些许遗憾,没有一颗再折腾的心。加上 2014 下半年想走出去,经常出去唱歌和游玩,回来的时候又玩玩 Dota,就这样过了 2 年。

    重生

    辗转来到 2016 年 8 月,当时每天下班回来都要玩 Dota,玩得尽兴的时候会到了深更半夜。当时非常的迷茫,一直在寻找机会,也就是在那个月开始了第一行重构 DoYouHaoBaby 的代码。慢慢地找到了些感觉,也就慢慢改掉了游戏,开始了一段全新的旅程。

    Alpha.1 发布

    经历了 2 年时间断断续续开发,第一个版本很快就问世了,QueryPHP 1.0.0-alpha.1 发布,《渐进式 PHP 常驻框架引擎》。第一个版本花了 2 年时间,主要是吸取以前失败的经验,希望多花点时间在设计上,避免后期反反复复推倒重构。

    早年读 Vue 和 Laravel 开发历史新闻,在很早期的时候便开始编写了大量单元测试用例,于是在 2017 年中的时候接入到 Travis-ci,通过 PHPUNIT 编写大量单元测试用例来保证可靠产品交付,第一个 Alpha.1 版本的时候,整个框架的测试用例就突破了 2000 例。由于效果非常良好,这个时候便提出了一个 Slogan “百分之百单元测试覆盖直面 Bug”,用工匠精神去做一个纯粹的作品,产品文档、技术债务、计划功能和测试用例都需要任务化,将品控落实到每一个小小的步骤。

    工匠精神

    “工匠精神”,鼓励企业开展个性化定制、柔性化生产,培育精益求精的工匠精神,增品种、提品质、创品牌。

    QueryPHP 为了更好地交付产品,按照严格的方式逐步推进,一块一块将打磨,小到文案、代码排版,大到接口用户体验,慢工出细活,最终设计得以良好呈现。避免粗制滥造的作品,致力于创造高品质产品 Level Level Leevel,品控一直贯穿整个产品开发的各个流程。

    • v1.0.0-ga 2020 年 7 月 22 日

    • v1.0.0-rc.6 2020 年 4 月 18 日

    • v1.0.0-rc.5 2020 年 2 月 8 日

    • v1.0.0-rc.4 2020 年 1 月 20 日

    • v1.0.0-rc.3 2019 年 12 月 26 日

    • v1.0.0-rc.2 2019 年 11 月 24 日

    • v1.0.0-rc.1 2019 年 11 月 6 日

    • v1.0.0-beta.6 2019 年 10 月 16 日

    • v1.0.0-beta.5 2019 年 9 月 9 日

    • v1.0.0-beta.4 2019 年 7 月 28 日

    • v1.0.0-beta.3 2019 年 6 月 6 日

    • v1.0.0-beta.2 2019 年 5 月 20 日

    • v1.0.0-beta.1 2019 年 4 月 14 日

    • v1.0.0-alpha.3 2019 年 3 月 13 日

    • v1.0.0-alpha.2 2018 年 12 月 12 日

    • v1.0.0-alpha.1 2018 年 11 月 8 日

    • First line of code  2016 年 8 月

    关于性能与场景

    我们还是主要面向传统 PHP-FPM 场景,这是我们整个产品的核心,我们的 99% 的组件并不依赖 Swoole 。很多时候,这已经够了,比我们想象中的更加强大。

    依托 Swoole 开启未来更多可能,整个框架可以运行于 Swoole 服务中,目前开启一键协程化不可关闭。目前支持了 HTTP 和 WebSocket,可以满足你的一些开发需求,并且也是我们的未来的一个重点支持方向。支持了 MySQL 和 Redis 连接池,可以更好地使用。

    相对于 Swoole 来说,我特别想推荐的是 Go RoadRunner 来运行你的 PHP 应用。Golang 接受 PSR-7 请求,负责管理运行于 CLI 模式 的 PHP 常驻进程,避免框架化带来的性能开销。该公司是一家以 PHP 与 Golang 的为主语言的公司,据他们新闻说,在实际项目中能带来 15 倍的提升,兼容性好很强大,目前 QueryPHP 已经支持,未来将会更好地像这个方向完善。

    我自己也在搞一些 Golang,Rust 方向,可以选择这些其它语言来提升性能与扩展场景。

    开发路线

    打造出面向企业级的产品,尽可能少的破坏性更新,为企业开发舔砖加瓦。未来主要优化用户体验,编写更多边界测试,以求提升产品的可靠性。

    安装

    为了简化入门,我们开发了一个基于 IView-UI 通用后台权限系统,可以在传统 PHP-FPM,Swoole 和 RoadRunner 3 中模式下面运行。

    composer create-project hunzhiwange/queryphp myapp php leevel server <Visite http://127.0.0.1:9527/>

    Swoole 方式运行

    php leevel http:server <Visite http://127.0.0.1:9527/>

    Go RoadRunner 方式运行

    /data/server/roadrunner-1.8.2-darwin-amd64/rr serve -d -v # -d = debug <Visite http://127.0.0.1:9527/>

    运行基于 IViewUI 的通用权限系统

    cd /data/codes/queryphp/frontend npm install npm run dev

    cd /data/codes/queryphp php leevel server http://127.0.0.1:9528/#/login

    联系方式

    如果你觉得不错,可以关注一下项目,谢谢。

    https://www.queryphp.com

    Email: [email protected]

    23 条回复    2020-07-25 12:41:41 +08:00
    qwertyzzz
        1
    qwertyzzz  
       2020-07-24 13:47:05 +08:00
    不错不错 我选影魔
    zh1997
        2
    zh1997  
       2020-07-24 14:11:35 +08:00
    QueryPHP 和 leevel 是什么关系?
    peinhu
        3
    peinhu  
       2020-07-24 14:15:54 +08:00   ❤️ 1
    还好不是基于 swoole 的,Go RoadRunner 看起来不错,准备研究下。
    doyouhaobaby
        4
    doyouhaobaby  
    OP
       2020-07-24 14:20:51 +08:00
    @zh1997 Leevel 是单词 level 加入一个 e 新造的词,也是我们包管理的顶层命名空间
    Use Leevel\Database\Ddd\Entity;
    byzf
        5
    byzf  
       2020-07-24 14:25:49 +08:00
    建议重新组织一下 readme, 中英文都很生硬.
    doyouhaobaby
        6
    doyouhaobaby  
    OP
       2020-07-24 16:14:32 +08:00
    @byzf 嗯,研究研究
    bzj
        7
    bzj  
       2020-07-24 16:33:17 +08:00
    QueryPHP 和 PHPQuery 是什么关系?
    chnwine
        8
    chnwine  
       2020-07-24 16:35:11 +08:00
    @doyouhaobaby 第一次见你的网名还是 10 年, 这么久不见又出框架了哈
    doyouhaobaby
        9
    doyouhaobaby  
    OP
       2020-07-24 16:35:23 +08:00
    @bzj 没有关系,只是交换了一下位置。
    doyouhaobaby
        10
    doyouhaobaby  
    OP
       2020-07-24 16:36:30 +08:00
    @chnwine 是不是额,这个框架还是哪个网名框架,重构的而来的,有些代码还是 10 年的代码,比如 配置组件。
    leafdream
        11
    leafdream  
       2020-07-24 16:36:31 +08:00
    搞 php 收益太低了
    doyouhaobaby
        12
    doyouhaobaby  
    OP
       2020-07-24 17:14:47 +08:00
    @leafdream 嗯,PHP 也弄,主要搞 golang 方面了
    leonidas
        13
    leonidas  
       2020-07-24 17:36:49 +08:00
    赞一个
    leonidas
        14
    leonidas  
       2020-07-24 17:39:08 +08:00
    顺便留楼问下
    php 怎么开启常驻进程 除了死循环外 例如消费消息队列时
    JaguarJack
        15
    JaguarJack  
       2020-07-24 18:33:34 +08:00
    @leonidas 写个 daemon
    lensko
        16
    lensko  
       2020-07-24 19:51:52 +08:00
    @leonidas 阻塞监听
    kajweb
        17
    kajweb  
       2020-07-24 20:27:33 +08:00
    开心,又多了一个轮子了。
    falcon05
        18
    falcon05  
       2020-07-24 20:31:21 +08:00 via iPhone
    Leevel 是什么意思
    doyouhaobaby
        19
    doyouhaobaby  
    OP
       2020-07-24 20:49:15 +08:00
    @falcon05Leevel 是单词 level 加入一个 e 新造的词,高级层次,也是我们包管理的顶层命名空间
    Use Leevel\Database\Ddd\Entity;
    ohao
        20
    ohao  
       2020-07-24 22:07:00 +08:00 via iPhone
    原则上支持

    但是步子迈太大容易扯淡,国内很多项目都是脑袋一热搞起来,然后用户多了就停了或者半死不活,几年更新一次,不然就是每个大版本接近重写完全没版本兼容性......

    希望吸取教训,好好维护.
    doyouhaobaby
        21
    doyouhaobaby  
    OP
       2020-07-24 23:36:09 +08:00
    @ohao 说得很有道理,保持专注,做好质量把控。很多项目除了上述原因,还有就是久了代码难以维护,让人失去了信心。
    dvaknheo
        22
    dvaknheo  
       2020-07-25 09:59:29 +08:00
    前些天,我看到个 yii2 的项目是把业务写在 [验证] 上。
    QueryPHP 的这个 demo,是把业务写在 [注解] 上?
    demo 里的文件实在是太多了。我找不出业务逻辑的代码在哪里。
    leonidas
        23
    leonidas  
       2020-07-25 12:41:41 +08:00
    @JaguarJack
    @lensko
    写个 daemon 死循环阻塞 然后 php -f 执行?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3264 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 13:03 · PVG 21:03 · LAX 05:03 · JFK 08:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.