返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP Hyperf3.0有哪些新功能
  • 175
分享到

PHP Hyperf3.0有哪些新功能

2023-07-04 22:07:21 175人浏览 独家记忆
摘要

本篇内容主要讲解“PHP Hyperf3.0有哪些新功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php Hyperf3.0有哪些新功能”吧!原生注解(Attribute)随着 PHP 8.

本篇内容主要讲解“PHP Hyperf3.0有哪些新功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习php Hyperf3.0有哪些新功能”吧!

原生注解(Attribute)

随着 PHP 8.1、8.2 的发布,给 PHP 带来了很多新的特性,其中与 Hyperf 最为相关的就是 PHP 的原生注解(Attribute)了,Hyperf 3.0 也放弃了过往采用的基于注释解析的注解功能实现,转而采用 PHP 的原生注解,当然对应依赖的 PHP 版本,也将调整为最低要求 PHP 8.0。

我们以一个最简单的 Controller 案例来呈现新的原生注解的使用:

<?phpdeclare(strict_types=1);namespace App\Controller;use Hyperf\httpserver\Contract\RequestInterface;use Hyperf\HttpServer\Annotation\Controller;use Hyperf\HttpServer\Annotation\RequestMapping;#[Controller]class IndexController{    // Hyperf 会自动为此方法生成一个 /index/index 的路由,允许通过 GET 或 POST 方式请求    #[RequestMapping(path: "index", methods: "get,post")]    public function index(RequestInterface $request)    {        // 从请求中获得 id 参数        $id = $request->input('id', 1);        return (string)$id;    }}

同时随着原生注解的应用,在 3.0 中也能够支持在同一个位置重复应用同一个注解了,比如过往在一个 Controller Action 想要应用多个 Middleware 时,需要通过 @Middlewares 注解包含多个 @Middleware 注解实现应用,而在 3.0 则可直接书写多个 @Middleware 注解实现该应用。同时在 3.0 中,注解也可以应用在方法的参数上,以实现一些针对方法参数定义、参数解析等功能。

从 注释注解 调整为 原生注解,也无需担忧过往项目的迁移改造工作量,Hyperf 也提供了对应的工具一键自动转换,只需要在 2.2 时引入 hyperf/code-generator 组件,并执行 php bin/hyperf.php code:generate -D app 命令,即可将 app 文件夹内的注释注解自动转为原生注解,轻松省力~

分布式事务

在过去的一年里,Hyperf 团队也为 PHP 领域孵化了两个前所未有的分布式事务组件并贡献到对应的开源社区,对应 DTM (首个基于 Go 语言实现的流行分布式事务管理器) 与 Seata (由阿里巴巴开源的流行分布式事务管理器) 两款主流的开源分布式事务管理器,分别是 dtm-php/dtm-client 和 seata/seata-php ,其中 dtm-php 是实现了 dtm 完整功能的分布式事务客户端,已支持 TCC模式SagaXA二阶段消息模式的分布式事务模式,并分别实现了与 DTM Server 以 HTTP 协议grpc 协议 通讯,该客户端可安全运行于 PHP-FPM 和 Swoole 协程环境中,更是对 Hyperf 框架做了更加易用的功能支持,可应用于生产环境中,而 seata-php 仍在开发迭代中,尚未能用于生产环境,也希望能有更多人参与进来共同迭代。

我们也以一个简单的例子来说明如何在 Hyperf 中实现一个 TCC 分布式事务的调用,其它分布式事务模式可查阅 dtm-php repo 的 README 文件,或 Hyperf 3.0 文档关于分布式事务一章。

<?phpnamespace App\Controller;use DtmClient\TCC;use DtmClient\TransContext;use Hyperf\Di\Annotation\Inject;use Hyperf\HttpServer\Annotation\Controller;use Hyperf\HttpServer\Annotation\GetMapping;use Throwable;#[Controller(prefix: '/tcc')]class TccController{    protected string $serviceUri = 'http://127.0.0.1:9501';    #[Inject]    protected TCC $tcc;    #[GetMapping(path: 'successCase')]    public function successCase()    {        try {            $this->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',                    // Cancel 方法的 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 并返回        return TransContext::getGid();    }}

至于其它事务模式,如  SagaXA二阶段消息模式等,可以具体查阅 dtm-php/dtm-client 仓库的 Readme 文件或 Hyperf 3.0 的相关文档。

Swow 网络引擎

实际上在 Hyperf 2.2 中,就已经支持了 Swow 网络引擎的运行,随着 Swow 1.0 正式版的发布,在 Hyperf 3.0 中,我们也把 Swow 的应用提高到了一个更高的高度,Swow 实现了一套有史以来最完整的 PHP 协程模型,它全面释放了 PHP 的真正实力,使得开发者可以做到以往难以想象的事情,对比 Swoole 它具备更好的兼容性可调试性编程,它甚至能使 Hyperf 运行于原生 windows 环境下而无需借助 WSL 或 Docker,同时也提供了 SDBWatchdog 工具对协程运行进行调试和监控,极大的提升了 Hyperf 的可调试性。

我们提供了一个全新的 Skeleton 骨架项目用于快速创建一个基于 Swow 网络引擎的 Hyperf 应用,以下是一个简单的通过 Composer 创建应用的流程:

composer create-project hyperf/swow-skeleton:dev-master

创建后,确保您的 PHP 环境已经安装好了 Swow 扩展,便可直接通过 php bin/hyperf.php start 命令启动服务,整体使用与原来无异,Hyperf 底层已做好了适配。在 Windows 环境中也只需在 CMD 或者 Poweshell 中运行即可哦~

SDB 协程调试器

SDB 是一款使用 PHP 语言编写的协程调试器工具,使用上类似于 GDB,它具有以下的几个优点:

  • 使用简单,只需要一行代码即可开启;

  • 无需端口,可直接运行在 TTY 上;

  • 零成本,可在生产环境使用,不影响性能;

  • 功能强大,深度定制,量身打造类微型操作系统

通过 SDB,您可以对运行中的 Hyperf 应用进行交互,以实现查看当前所有协程状态窥视协程进入指定协程查看调用栈打断点单步调试查看及修改变量调试扫描僵尸协程Kill 协程等操作,真正意义上的将 PHP 协程带到了工程化的实用阶段

PHP Hyperf3.0有哪些新功能

Watchdog

Watchdog 为 PHP 提供了 CPU 调度能力,其核心原理是 Watchdog 线程会定期检查其它线程中协程的活跃度情况,若发现工作线程中的协程不再活跃,则通过 ZendVM 的中断机制对其进行状态确认,若 VM 中断失败,则表明工作线程陷入了系统调用阻塞,触发告警;若 VM 中断成功,则表明工作线程陷入了 CPU 密集运算或死循环,则立即触发用户设定的调度规则进行调度。

通过 Watchdog 可以实现 可编程的协程调度机制,可以非常方便的解决过往头疼的 CPU 饥饿 问题,以下是一些用法的演示:

// 运行超过 1ms 就让出控制权\Swow\WatchDog::run(1 * 1000 * 1000);// 运行超过 1ms 就让出 10ms,调度失败并超过 5ms 时视为系统调用阻塞\Swow\WatchDog::run(1 * 1000 * 1000, 5 * 1000 * 1000, 10);// 可编程方式,函数会在程序阻塞 100ms 后触发$alertCountMap = new WeakMap();\Swow\WatchDog::run(quantum: 100 * 1000 * 1000, alerter: static function () use ($alertCountMap): void {    $coroutine = Coroutine::getCurrent();    $alertCount = ($alertCountMap[$coroutine] ??= 0) + 1;    $alertCountMap[$coroutine] = $alertCount;    echo 'CPU starvation occurred, suspend this coroutine...' . PHP_EOL;    sleep(0);    if ($alertCount > 5) {        echo 'Kill the bad guy' . PHP_EOL;        $coroutine->kill();    }});

PHP Hyperf3.0有哪些新功能

Box

Box 是一个致力于帮助提升 PHP 应用程序的编程体验的工具,尤其有助于 Hyperf 应用,可以用于管理 PHP 环境和相关依赖,同时提供将 PHP 应用程序打包为二进制程序的能力,还提供反向代理服务来管理和部署 Swoole/Swow 服务。这些能力也是前所未有的,特别是将 Hyperf 或 PHP 应用打包为二进制程序的能力,打包好的程序,可以不依赖系统的 PHP 环境单独运行,以达到类似于 Go 语言的打包能力,这些能力也得益于 phpmicro 的发展,而 Box 则是站在巨人的肩膀上,将这些能力以更加简单易用的方式提供给大家使用~

以下是一个通过下载 Box 到创建一个 Hyperf 应用,并运行的简单案例:

安装 Box

// Macwget https://GitHub.com/hyperf/box/releases/download/v0.5.5/box_x86_64_macos -O boxsudo mv ./box /usr/local/bin/boxsudo chmod 755 /usr/local/bin/box// 确保 /usr/local/bin/box 在你的 $PATH 环境中,或者将 `box` 放到你想要的任意 $PATH 路径中// linux x86_64wget https://github.com/hyperf/box/releases/download/v0.5.5/box_x86_64_linux -O boxsudo mv ./box /usr/local/bin/boxsudo chmod 755 /usr/local/bin/box// 确保 /usr/local/bin/box 在你的 $PATH 环境中,或者将 `box` 放到你想要的任意 $PATH 路径中// Windowscurl -o box.exe https://github.com/hyperf/box/releases/download/v0.5.5/box_x64_windows.exe// 将 `box.exe` 放到你想要的任意 Path 环境变量路径中,同时 Windows 版本在执行时需要在命令行中使用 `box.exe` 而不是 `box`

初始化 Github Access Token

Box 需要一个 Github 访问令牌来请求 Github api,以便于从 GitHub Actions 的 Artifacts 中检索包的版本。

  • 创建 Github Access Token,workflow 范围需要勾选;

  • 运行 box config set github.access-token <Your Token> 命令来设置您的 token

我们将在 v0.6 版本让使用 Box 前无需设置 Github Access Token,以提供更加简便的使用体验,请期待~

通过 Box 初始化 PHP 环境并启动 Hyperf

// 通过 box 安装 PHP 8.1,此安装不会影响系统原来自身安装的 PHPbox get php@8.1// 通过 box 安装 composerbox get composer// 通过 box composer 创建 hyperf 应用,可指定 dev-master 分支以防止 packaGISt 代理数据落后的问题box composer create-project hyperf/swow-skeleton:dev-master// 通过 box 启动 hyperfbox hyperf start

至此一个完整的安装和运行流程已完成,我们可以发现过往复杂的环境部署环节,已经简化为了区区几个命令,通过 && 连接符甚至可以组成一行命令足以。

通过 Box 打包 Hyperf 应用为二进制程序

这个神奇的能力,在操作上也被简化得匪夷所思,只需预先执行 box build-prepare 命令提前下载好相关依赖,这个命令只需执行一次即可,后续即可通过 box build 命令对当前所在文件夹的 Hyperf 应用进行打包动作。打包好后,当前文件夹会出现一个名为 hyperf 的二进制文件,后续只需要通过 hyperf start 命令即可启动该 Hyperf 应用。

Box 自身就是一个基于 Box 打包出来的 Hyperf 应用,大家也可以通过了解 Box 项目本身,来了解该能力的使用。

Box Kernel 切换

默认情况下,Box 由 Swow Kernel 提供支持,但是我们也提供了 Swoole Kernel,您可以通过 box config set kernel swoole 来切换为 Swoole Kernel,但是需要注意的是,Swoole Kernel 仅支持 PHP 8.1 版本,且不支持构建二进制程序功能和 Windows 系统环境。

// 设置为 Swow Kernel [默认]box config set kernel swow// 设置为 Swoole Kernel (不支持 Windows)box config set kernel swoole

Box 的更多能力

Box 还有更多有意思的使用方法和工具组合,可以通过下面的部分的命令清单快速一览

命令

box get pkg@version从远程安装包,pkg是包名,version是包的版本,box get pkg表示安装最新版本的 pkg,例如, 运行 box get php@8.1 安装 PHP 8.1, 运行 box get composer 安装最新的 composer binbox build-prepare 为 build 和 build-self 命令做好相关环境的准备box build-self 构建 box bin 本身box build <path> 将 Hyperf 应用程序构建成二进制文件box self-update 将 box bin 更新至最新版本box config set-php-version <version>设置 box 的当前 PHP 版本,可用值:8.0 | 8.1box config get-php-version <version>获取 box 的当前设置的 PHP 版本box reverse-proxy -u <upsteamHost:upstreamPort> 启动一个反向代理 HTTP 服务器,用于将 HTTP 请求转发到指定的多个上游服务器box php <argument> 通过当前 box 的 PHP 版本运行任何 PHP 命令box composer <argument>通过当前 box 的 PHP 版本运行任何 Composer 命令box php-cs-fixer <argument> 通过当前 box 的 PHP 版本运行任何 php-cs-fixer 命令box cs-fix <argument> 通过当前 box 的 PHP 版本运行 php-cs-fixer fix 命令box phpstan <argument> 通过当前 box 的 PHP 版本运行任何 phpstan 命令box pint <argument> 通过当前 box 的 PHP 版本运行任何 pint 命令

到此,相信大家对“PHP Hyperf3.0有哪些新功能”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: PHP Hyperf3.0有哪些新功能

本文链接: https://lsjlt.com/news/347910.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • PHP Hyperf3.0有哪些新功能
    本篇内容主要讲解“PHP Hyperf3.0有哪些新功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP Hyperf3.0有哪些新功能”吧!原生注解(Attribute)随着 PHP 8....
    99+
    2023-07-04
  • JDK15有哪些新功能
    这篇文章主要介绍“JDK15有哪些新功能”,在日常操作中,相信很多人在JDK15有哪些新功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JDK15有哪些新功能”的疑惑有所帮...
    99+
    2024-04-02
  • java8有哪些新功能
    这篇文章主要讲解了“java8有哪些新功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java8有哪些新功能”吧!并行流认识开启并行流并行流是什么是把一个...
    99+
    2024-04-02
  • ES2021有哪些新功能
    本篇内容主要讲解“ES2021有哪些新功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ES2021有哪些新功能”吧!简述ES2021(ES12)将于 2021...
    99+
    2024-04-02
  • ubuntu14.04 新功能有哪些
    这篇文章主要介绍“ubuntu14.04 新功能有哪些”,在日常操作中,相信很多人在ubuntu14.04 新功能有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ubuntu14.04 新功能有哪些”的疑...
    99+
    2023-06-13
  • Java9有哪些新功能
    本篇内容介绍了“Java9有哪些新功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、模块化的源代码JDK 源代码将以模块化的形式组织起来...
    99+
    2023-06-17
  • Flex2.0Beta1新功能有哪些
    这篇文章主要介绍Flex2.0Beta1新功能有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Flex2.0Beta1的新功能Flex2.0产品系列能够使开发者构建丰富、吸引人的基于Web的应用程序,这些应用程序...
    99+
    2023-06-17
  • Flink1.8.0新功能有哪些
    这篇文章主要介绍“Flink1.8.0新功能有哪些”,在日常操作中,相信很多人在Flink1.8.0新功能有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Flink1.8.0新功能有哪些”的疑惑有所帮助!...
    99+
    2023-06-19
  • Laravel8.78有哪些新功能
    本篇内容主要讲解“Laravel8.78有哪些新功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Laravel8.78有哪些新功能”吧!Laravel 团队发布了 8.78,能够向默认密码验证...
    99+
    2023-06-26
  • win10有哪些新功能
    Windows 10拥有许多新功能,以下是其中一些:1. 开始菜单:Windows 10还原了传统的开始菜单,它结合了Windows...
    99+
    2023-10-21
    win10
  • Xcode8有哪些新功能
    Xcode 8的一些新功能包括: Swift 3.0:支持最新版本的Swift编程语言。 自动布局调试工具:可以在运行时查看和调试...
    99+
    2023-10-20
    Xcode
  • Laravel10有哪些新功能
    本文小编为大家详细介绍“Laravel10有哪些新功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“Laravel10有哪些新功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Laravel 10 将在用户空间...
    99+
    2023-07-04
  • Web3.0有哪些新功能
    这篇文章主要介绍“Web3.0有哪些新功能”,在日常操作中,相信很多人在Web3.0有哪些新功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Web3.0有哪些新功能”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-07-04
  • Laravel9.37有哪些新功能
    这篇文章主要介绍“Laravel9.37有哪些新功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Laravel9.37有哪些新功能”文章能帮助大家解决问题。Verbose 视图缓存Andrew B...
    99+
    2023-07-04
  • Laravel9.35有哪些新功能
    这篇文章主要介绍“Laravel9.35有哪些新功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Laravel9.35有哪些新功能”文章能帮助大家解决问题。备用邮件语法Taylor Otwell ...
    99+
    2023-07-04
  • Android13新功能有哪些
    本文小编为大家详细介绍“Android13新功能有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android13新功能有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。新功能和API带主题的应用图标让应...
    99+
    2023-07-05
  • PHP编译器BPC6.0的新功能有哪些
    这篇文章主要介绍“PHP编译器BPC6.0的新功能有哪些”,在日常操作中,相信很多人在PHP编译器BPC6.0的新功能有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP编译器BPC6.0的新功能有哪些...
    99+
    2023-07-04
  • Python3.9的新功能有哪些
    这篇文章主要介绍“Python3.9的新功能有哪些”,在日常操作中,相信很多人在Python3.9的新功能有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python3....
    99+
    2024-04-02
  • Vue 2.5新功能有哪些
    本篇内容主要讲解“Vue 2.5新功能有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue 2.5新功能有哪些”吧!更好的 TypeScript 集成得益...
    99+
    2024-04-02
  • Python 3.0有哪些新功能
    本篇内容介绍了“Python 3.0有哪些新功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在Python 3.1的开发计划中,很大一部分...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作