当前位置: 首页 > 后端技术 > PHP

Hyperf3.0发布,PHP新时代

时间:2023-03-29 13:39:06 PHP

Hyperf3.0,新时代来临Review在过去一年半的时间里,Hyperf2.2发布了35个小版本,让Hyperf达到了一个前所未有的高度,这里有一些Nice数据反馈。Hyperf在GitHub和Gitee上的关注度也有了明显提升,分别有4.9k和791stars,整体关注度增长也很稳定。Hyperf框架的安装量也达到了90万次,每天大约有1300次安装,这也说明Hyperf已经在相关行业得到了广泛的应用,支持了大量的系统操作。Hyperf组织下的有效repo已经达到140个左右(去掉Archive项目后),维护工作量空前庞大,但迭代依然频繁。感谢Hyperf团队所有成员的辛勤工作和贡献,也感谢所有PR贡献者。没有你们的参与,就没有Hyperf的今天。感谢所有贡献者Hyperf3.0新时代Hyperf3.0带来了许多非常有趣的新功能,其中一些功能在PHP领域是前所未有的。当然,这些新能力离不开其他开源社区的积极发展,包括但不限于PHP、Swoole、Swow、PHPMicro、DTM、Seata等开源社区也真诚希望大家能为这些开源贡献力量业余时间来源社区,共建美好未来。原生注解(Attribute)随着PHP8.1和8.2的发布,给PHP带来了很多新特性。其中,与Hyperf关系最密切的是PHP原生的注解(Attribute)。Hyperf3.0也放弃了过去使用的基于注解的注解。实现了解析注解功能,改用PHP原生注解。当然对应的PHP版本依赖也会调整到PHP8.0的最低要求。我们使用最简单的Controller案例来展示新原生注解的使用:HttpServer\Annotation\RequestMapping;#[Controller]classIndexController{//Hyperf会自动为该方法生成/index/index路由,允许通过GET或POST请求#[RequestMapping(path:"index",methods:"get,post")]publicfunctionindex(RequestInterface$request){//从请求参数中获取id$id=$request->input('id',1);返回(字符串)$id;同时随着原生注解的应用,在3.0中,也可以支持在同一个位置重复应用同一个注解。比如以前一个ControllerAction要应用多个Middleware时,需要通过@Middlewares注解包含多个@Middleware注解来实现应用,而在3.0中可以直接写多个@Middleware注解来实现应用。同时,在3.0中,还可以对方法参数进行注解,实现方法参数定义、参数解析等功能。从注解注解调整为原生注解,不用担心之前项目迁移改造的工作量。Hyperf也提供了相应的工具,可以一键自动转换。只需要在2.2中引入hyperf/code-generator组件,执行phpbin/hyperf.phpcode:generate-Dapp命令,app文件夹下的注解就可以自动转为原生注解,简单又省力~分布式事务在过去的一年里,Hyperf团队还孵化了两个前所未有的针对PHP领域的分布式事务组件,并贡献给了相应的开源社区,分别对应DTM(第一个流行的基于Go语言的分布式事务管理器)和Seata(阿里巴巴开源的流行分布式事务管理器)两种主流的开源分布式事务管理器,分别是dtm-php/dtm-client和seata/seata-php,其中dtm-php是一个分布式事务客户端,实现了dtm的全部功能,并支持TCC模式、Saga、XA、二阶段消息模式的分布式事务模式,并通过分别为HTTP协议或gRPC协议。客户端可以安全的运行在PHP-FPM和Swoole协程环境中,更容易使用Hyperf框架。的功能支持,可以在生产环境中应用,而seata-php还在开发迭代中,还没有在生产环境中使用,希望有更多人参与共同迭代。我们也用一个简单的例子来说明如何在Hyperf中实现一个TCC分布式事务调用。其他分布式事务模式请参考dtm-phprepo的README文件,或者Hyperf3.0文档中关于分布式事务的章节。tcc->globalTransaction(function(TCC$tcc){//创建子事务A的调用数据$tcc->callBranch(//调用Try方法的参数['amount'=>30],//Try方法的URL$this->serviceUri.'/tcc/transA/try',//Confirm方法的URL$this->serviceUri.'/tcc/transA/confirm',//取消方法URL$this->serviceUri.'/tcc/transA/cancel');//创建子事务B的调用数据,依此类推$tcc->callBranch(['amount'=>30],$this->serviceUri.'/tcc/transB/try',$this->serviceUri.'/tcc/transB/confirm',$this->serviceUri.'/tcc/transB/cancel');});}catch(Throwable$e){var_dump($e->getMessage(),$e->getTraceAsString());}//通过TransContext::getGid()获取全局事务ID并返回returnTransContext::getGid();}}至于其他事务模式,如Saga、XA、二阶段消息模式等,可以具体参考dtm-php/dtm-client仓库中的Readme文件或Hyperf3.0的相关文档。Swow网络引擎实际上支持Hyperf2.2中Swow网络引擎的运行。随着Swow1.0正式版的发布,在Hyperf3.0当中,我们也将Swow的应用提升到了一个更高的层次。Swow实现了一套史上最完整的PHP协程模型,充分释放了PHP的真正实力,让开发者可以做以前难以想象的事情。与Swoole相比,具有更好的兼容性、可调试性和可编程性。它甚至可以让Hyperf在没有WSL或Docker的情况下运行在原生Windows环境中。它还提供了SDB和Watchdog工具来运行协程。调试和监控大大提高了Hyperf的可调试性。我们提供全新的Skeleton骨架工程,用于快速创建基于Swow网络引擎的Hyperf应用。下面是一个简单的通过Composer创建应用程序的过程:composercreate-projecthyperf/swow-skeleton:dev-master创建完成后,确保你的PHP环境中已经安装了Swow扩展,可以直接启动服务通过phpbin/hyperf.php启动命令。整体使用和之前一样,对Hyperf的底层进行了适配。Windows环境下,只需要在CMD或者Powershell中运行即可~SDBCoroutineDebuggerSDB是一款用PHP语言编写的协程调试工具。它在使用上类似于GDB。它具有以下优点:使用方便,只需一行代码即可打开;没有端口,可以直接在TTY上运行;零成本,可用于生产环境,不影响性能;强大、深度定制、量身定制的微型操作系统;通过WithSDB,可以与运行中的Hyperf应用进行交互,查看所有协程的当前状态,窥视协程,进入指定协程,查看调用栈,断点,单步调试,查看修改变量调试,scan僵尸协程和Kill协程等操作,真正将PHP协程带入了工程化的实用阶段。WatchdogWatchdog为PHP提供CPU调度能力。核心原理是看门狗线程会周期性的检查其他线程中协程的活跃度。如果发现工作线程中的协程不再活跃,就会通过ZendVM的中断机制进行检查。确认如果VM中断失败,说明worker线程被系统调用阻塞,触发告警;如果VM中断成功,说明工作线程陷入CPU密集型操作或死循环,立即触发用户设置的调度规则进行调度。通过Watchdog可以实现可编程的协程调度机制,可以轻松解决以往令人头疼的CPU饿死问题。下面是一些用法演示://运行超过1ms就放弃控制\Swow\WatchDog::r??un(1*1000*1000);//如果运行超过1ms,就会放弃10ms。当调度失败超过5ms时,将被视为系统调用阻塞\Swow\WatchDog::r??un(1*1000*1000,5*1000*1000,10);//可编程,函数会在程序阻塞100ms后触发$alertCountMap=newWeakMap();\Swow\WatchDog::r??un(quantum:100*1000*1000,alerter:staticfunction()use($alertCountMap):void{$coroutine=Coroutine::getCurrent();$alertCount=($alertCountMap[$coroutine]??=0)+1;$alertCountMap[$coroutine]=$alertCount;echo'CPU饥饿发生,暂停这个协程。..'.PHP_EOL;sleep(0);if($alertCount>5){echo'杀死坏人'.PHP_EOL;$coroutine->kill();}});更多关于SDB和WatchDog的用法等等多用途的文档目前可能还不完整。以后我们会写几篇文章来讲解用法,我们会尽快完善相关文档~BoxBox是一个致力于帮助提升PHP应用程序编程体验的工具,尤其是Hyperf应用程序,可以用来管理PHP环境及相关依赖,同时提供将PHP应用程序打包成二进制程序的能力,同时也提供反向代理服务来管理和部署Swoole/Swow服务。这些能力也是前所未有的,尤其是能够将Hyperf或PHP应用程序打包成二进制程序。打包后的程序可以独立于系统的PHP环境运行,实现类似Go语言的打包能力。这些能力也得益于基于phpmicro的开发,Box站在巨人的肩膀上,以更简单易用的方式为大家提供这些能力~下面是一个简单的下载Box创建一个案例Hyperf应用程序并运行它:安装Box//Macwgethttps://github.com/hyperf/box/releases/download/v0.5.5/box_x86_64_macos-Oboxsudomv./box/usr/local/bin/boxsudochmod755/usr/local/bin/box//确保/usr/local/bin/box在您的$PATH环境中,或者将`box`放入您想要的任何$PATH//Linuxx86_64wgethttps://github.com/hyperf/box/releases/download/v0.5.5/box_x86_64_linux-Oboxsudomv./box/usr/local/bin/boxsudochmod755/usr/local/bin/box//确保/usr/local/bin/box是在您的$PATH环境中,或将`box`放入您想要的任何$PATH路径中//Windowscurl-obox.exehttps://github.com/hyperf/box/releases/download/v0.5.5/box_x64_windows。exe//将`box.exe`放在任意你想要的Path环境变量路径下,Windows版本执行时需要在命令行中使用`box.exe`而不是`box`。GithubAccessTokenBox需要Github访问令牌来请求GithubAPI,以便从GitHubActions中的Artifacts检索包的版本。要创建GithubAccessToken,需要检查工作流程的范围;运行boxconfigsetgithub.access-token命令来设置你的令牌;我们将在v0.6版本提供使用Box前无需设置GithubAccessToken期待更便捷的使用体验~通过Box初始化PHP环境,启动Hyperf//通过box安装PHP8.1,本次安装不会影响系统原有的PHP安装。boxgetphp@8.1//通过box安装composerboxgetcomposer//通过boxcomposer创建hyperf应用,可以指定dev-master分支,防止packagist代理数据滞后的问题boxcomposercreate-projecthyperf/swow-skeleton:dev-master//通过boxhyperfstart启动hyperf至此一个完整的安装和运行过程已经完成,我们可以发现以往复杂的环境部署环节已经简化为几条命令,甚至一行命令可以通过&&连接器组成。通过Box将Hyperf应用程序打包为二进制程序的神奇能力,在操作方面也得到了令人难以置信的简化。只需要提前执行boxbuild-prepare命令,提前下载相关依赖即可。这个命令只需要执行一次,后面可以传过去。boxbuild命令将Hyperf应用程序打包到当前文件夹中。打包后,当前文件夹中会出现一个名为hyperf的二进制文件,只需运行hyperfstart命令即可启动Hyperf应用。Box本身是基于Box封装的Hyperf应用。您还可以通过了解Box项目本身来了解此功能的使用。BoxKernel切换SwowKernel默认支持Box,但是我们也提供了SwooleKernel,你可以通过boxconfigsetkernelswoole切换到SwooleKernel,但是需要注意的是SwooleKernel只支持PHP8.1版本,而且是不支持构建二进制程序功能和Windows系统环境。//SettoSwowKernel[Default]boxconfigsetkernelswow//设置为SwooleKernel(Windows不支持)boxconfigsetkernelswooleBox的更多能力还有更多有趣的使用方法和工具组合,可以使用下面的A部分命令列表的快速概览命令框getpkg@version远程安装包,其中pkg是包名称,version是包的版本。boxgetpkg表示安装最新版本的pkg。例如,运行boxgetphp@8.1安装PHP8.1,运行boxgetcomposer安装最新的composerbinboxbuild-prepare为构建和build-self命令准备环境boxbuild-self构建boxbin本身boxbuild将Hyperf应用程序构建成二进制文件boxself-update将boxbin更新为最新版本boxconfigset-php-version设置box当前的PHP版本,可用值:8.0|8.1boxconfigget-php-version获取box当前设置的PHP版本boxreverse-proxy-u启动一个反向代理HTTP服务器,用于转发HTTP请求到指定的上游服务器boxphp通过当前框运行任何PHP命令PHP版本boxcomposer使用当前框的PHP版本框运行任何Composer命令boxphp-cs-fixer使用当前框的PHP版本框运行任何php-cs-fixer命令cs-fix使用当前框的PHP版本运行php-cs-fixerfix命令框phpstan<argument>通过当前PHP版本的boxpint运行任何phpstan命令boxpint通过当前PHP版本的box运行任何pint命令CHANGELOG-3.0.md文件同时,我们还准备了一个指南从2.2升级到3.0。详情请参考Hyperf官方文档-3.0升级指南章节。

最新推荐
猜你喜欢