您好,登錄后才能下訂單哦!
本篇內容主要講解“PHP Hyperf3.0有哪些新功能”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“PHP Hyperf3.0有哪些新功能”吧!
隨著 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模式
、Saga
、XA
、二階段消息
模式的分布式事務模式,并分別實現了與 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();
}
}
至于其它事務模式,如 Saga
、XA
、二階段消息
模式等,可以具體查閱 dtm-php/dtm-client
倉庫的 Readme 文件或 Hyperf 3.0 的相關文檔。
實際上在 Hyperf 2.2 中,就已經支持了 Swow 網絡引擎的運行,隨著 Swow 1.0 正式版的發布,在 Hyperf 3.0 中,我們也把 Swow 的應用提高到了一個更高的高度,Swow 實現了一套有史以來最完整的 PHP 協程模型
,它全面釋放了 PHP 的真正實力,使得開發者可以做到以往難以想象的事情,對比 Swoole 它具備更好的兼容性
、可調試性
、可編程性
,它甚至能使 Hyperf 運行于原生 Windows 環境
下而無需借助 WSL 或 Docker,同時也提供了 SDB
和 Watchdog
工具對協程運行進行調試和監控,極大的提升了 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
是一款使用 PHP 語言編寫的協程調試器
工具,使用上類似于 GDB
,它具有以下的幾個優點:
使用簡單,只需要一行代碼即可開啟;
無需端口,可直接運行在 TTY
上;
零成本,可在生產環境使用,不影響性能;
功能強大,深度定制,量身打造類微型操作系統;
通過 SDB
,您可以對運行中的 Hyperf 應用進行交互,以實現查看當前所有協程狀態
、窺視協程
、進入指定協程
、查看調用棧
、打斷點
、單步調試
、查看及修改變量調試
、掃描僵尸協程
、Kill 協程
等操作,真正意義上的將 PHP 協程帶到了工程化的實用階段
。
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();
}
});
Box 是一個致力于幫助提升 PHP 應用程序的編程體驗的工具,尤其有助于 Hyperf 應用,可以用于管理 PHP 環境和相關依賴
,同時提供將 PHP 應用程序打包為二進制程序
的能力,還提供反向代理服務
來管理和部署 Swoole/Swow 服務。這些能力也是前所未有的,特別是將 Hyperf 或 PHP 應用打包為二進制程序的能力,打包好的程序,可以不依賴系統的 PHP 環境
單獨運行,以達到類似于 Go 語言的打包能力,這些能力也得益于 phpmicro
的發展,而 Box 則是站在巨人的肩膀上,將這些能力以更加簡單易用的方式提供給大家使用~
以下是一個通過下載 Box 到創建一個 Hyperf 應用,并運行的簡單案例:
// 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`
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 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 build-prepare
命令提前下載好相關依賴,這個命令只需執行一次即可,后續即可通過 box build
命令對當前所在文件夾的 Hyperf 應用進行打包動作。打包好后,當前文件夾會出現一個名為 hyperf
的二進制文件,后續只需要通過 hyperf start
命令即可啟動該 Hyperf 應用。
Box 自身就是一個基于 Box 打包出來的 Hyperf 應用,大家也可以通過了解 Box 項目本身,來了解該能力的使用。
默認情況下,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 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 命令
到此,相信大家對“PHP Hyperf3.0有哪些新功能”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。