关于php:Hyperf-30-发布PHP-新时代

2次阅读

共计 7444 个字符,预计需要花费 19 分钟才能阅读完成。

Hyperf 3.0,新时代降临

回顾

在过来的一年半工夫里,Hyperf 2.2 共公布了 35 个小版本,使 Hyperf 达到了一个 前所未有的高度,这里也取得了一些不错的数据反馈。

Hyperf 在 GitHubGitee 上的关注度也失去了显著晋升,别离取得了 4.9k791star,整体关注度增长也很稳固。

Hyperf 框架的装置量也达到了 90 万次 ,每天都有约 1300 次 的装置,这也表明了 Hyperf 曾经 广泛应用 于相干行业中并撑持了大量的零碎运行。

Hyperf 组织下的无效 repo 更是达到了约 140 个(去除掉 Archive 我的项目后),保护工作量空前微小,但迭代依然高频。

感激 Hyperf 团队全体成员的辛勤以及奉献,同时也感激所有的 PR 贡献者,没有你们的参加也就没有明天的 Hyperf。

Thanks ALL Contributors

Hyperf 3.0 新时代

Hyperf 3.0 带来了很多十分有意思的新能力,其中一些新能力不乏是 PHP 畛域外面 前所未有 的,当然这些新能力也脱离不了其余开源社区的踊跃倒退,包含但不限于 PHPSwooleSwowPHPMicroDTMSeata 等开源社区,也衷心希望大家在空闲工夫能够为这些开源社区也奉献出本人的一份力,搭上一砖一瓦,共建更加美妙的将来。

原生注解(Attribute)

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

咱们以一个最简略的 Controller 案例来出现新的原生注解的应用:

<?php
declare(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 文档对于分布式事务一章。

<?php
namespace 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,它具备以下的几个长处:

  1. 应用简略,只须要一行代码即可开启;
  2. 无需端口,可间接运行在 TTY 上;
  3. 零老本,可在生产环境应用,不影响性能;
  4. 功能强大,深度定制,量身打造类微型操作系统;

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

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();}
});

更多用法

对于 SDBWatchDog 以及更多用法目前文档可能尚未欠缺,咱们接下来也会编写多篇文章来论述用法,也会尽快欠缺相干文档~

Box

Box 是一个致力于帮忙晋升 PHP 应用程序的编程体验的工具,尤其有助于 Hyperf 利用,能够用于 治理 PHP 环境和相干依赖 ,同时提供将 PHP 应用程序 打包为二进制程序 的能力,还提供 反向代理服务 来治理和部署 Swoole/Swow 服务。这些能力也是前所未有的,特地是将 Hyperf 或 PHP 利用打包为二进制程序的能力,打包好的程序,能够 不依赖零碎的 PHP 环境 独自运行,以达到相似于 Go 语言的打包能力,这些能力也得益于 phpmicro 的倒退,而 Box 则是站在伟人的肩膀上,将这些能力以更加简略易用的形式提供给大家应用~

以下是一个通过下载 Box 到创立一个 Hyperf 利用,并运行的简略案例:

装置 Box
// Mac
wget https://github.com/hyperf/box/releases/download/v0.5.5/box_x86_64_macos -O box
sudo mv ./box /usr/local/bin/box
sudo chmod 755 /usr/local/bin/box
// 确保 /usr/local/bin/box 在你的 $PATH 环境中,或者将 `box` 放到你想要的任意 $PATH 门路中


// Linux x86_64
wget https://github.com/hyperf/box/releases/download/v0.5.5/box_x86_64_linux -O box
sudo mv ./box /usr/local/bin/box
sudo chmod 755 /usr/local/bin/box
// 确保 /usr/local/bin/box 在你的 $PATH 环境中,或者将 `box` 放到你想要的任意 $PATH 门路中


// Windows
curl -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 中检索包的版本。

  1. 创立 Github Access Token,workflow 范畴须要勾选;
  2. 运行 box config set github.access-token <Your Token> 命令来设置您的 token

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

通过 Box 初始化 PHP 环境并启动 Hyperf
// 通过 box 装置 PHP 8.1,此装置不会影响零碎原来本身装置的 PHP
box get php@8.1
// 通过 box 装置 composer
box get composer
// 通过 box composer 创立 hyperf 利用,可指定 dev-master 分支以避免 packagist 代理数据落后的问题
box composer create-project hyperf/swow-skeleton:dev-master
// 通过 box 启动 hyperf
box 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 bin
box 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.1
box 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 命令

更多优化

Hyperf 3.0 仍做了大量的优化和调整,具体能够浏览 Hyperf 主仓库中的 CHANGELOG-3.0.md 文件。

同时咱们也为大家筹备了一份从 2.2 降级至 3.0 的指南,具体可查阅 Hyperf 官网文档 – 3.0 降级指南 一章。

正文完
 0