PHP 框架 QueryPHP 1.0 正式版,四年打磨生产可用! - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
doyouhaobaby
V2EX    PHP

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

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

    [开源新闻] 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
    asLw0P981N0M0TCC
        1
    asLw0P981N0M0TCC  
       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 方面了
    novaa
        13
    novaa  
       2020-07-24 17:36:49 +08:00
    赞一个
    novaa
        14
    novaa  
       2020-07-24 17:39:08 +08:00
    顺便留楼问下
    php 怎么开启常驻进程 除了死循环外 例如消费消息队列时
    akagishigeru
        15
    akagishigeru  
       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
    开心,又多了一个轮子了。
    GG668v26Fd55CP5W
        18
    GG668v26Fd55CP5W  
       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 里的文件实在是太多了。我找不出业务逻辑的代码在哪里。
    novaa
        23
    novaa  
       2020-07-25 12:41:41 +08:00
    @JaguarJack
    @lensko
    写个 daemon 死循环阻塞 然后 php -f 执行?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4633 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 09:59 PVG 17:59 LAX 02:59 JFK 05:59
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86