Hyperf 2.0 發佈!想象的開端!

前言

Hyperf 從 2019 年 6 月 20 日發佈 1.0 版本至今,得到了很是多的關注和用戶,短短的一年期間,Hyperf 飛速發展和持續迭代,同時也擁有了很是驚人的數據。php

  • Github 2700 stars / Gitee 330 stars
  • 113 名 Contributors
  • 1100+ Pull Requests
  • 共發佈 47 個版本
  • 92 個代碼倉庫
  • 1438 個單元測試用例,4412 個斷言條件

這些數據是整個開源社區共同努力的結果,感謝全部支持 Hyperf 的大神的厚愛,期待將來更多的支持與合做。react

Thanks All Hyperf's Contributorsgit

Hyperf 2.0

在持續迭代的過程當中,咱們也產生了一些新的思路,咱們對這些思路進行了驗證、迭代、再驗證、再迭代,並最終將這些思路的實現沉澱到了 Hyperf 中來,並於今日,以 2.0 版本正式發佈了 🎉🎉🎉github

感謝 Hyperf 團隊成員日以繼夜的努力,使這些設想成爲了可能。web

主要功能迭代

AOP 和註解功能底層重構

在 1.1 版本下,儘管提供了很是強大的 AOP 和註解功能,但也仍有一些限制和不足以下:編程

  • AOP 只能切入由 hyperf/di 組件管理的對象,沒法切入其它方式建立的對象,如  new ;
  • 經過 DI 獲取的類其實是由 AOP 生成的一個原始類的子類,在子類上完成了對方法的修改,以完成 AOP 的功能實現,而子類的類名與原始類是不一致的,也就致使了  get_class()__CLASS__ 之類的方法或常量獲取的數據可能會不對;
  • 同上,異常堆棧信息會充滿了代理類的鏈路,不容易看清楚調用鏈路;
  • 同上,因爲是經過繼承實現的代理類,故一個 final 類是沒法被切入的;
  • 同上,對一個父類進行 AOP 切入後,這個類的子類並不會被切入;
  • 經過 new 實例化的一個對象  @Inject 和  @Value 註解沒法生效;
  • 您沒法在一個類的構造函數內使用經過  @Inject 和  @Value 註解獲取的值;
  • 在 trait 內經過  @Inject 和  @Value 註解標註的屬性沒法正常運做;
  • 在 PHP 8 下沒法經過類成員屬性的強類型聲明替代  @var 聲明來指定  @Inject 時的類聲明;
  • 使用註解時必須聲明對應註解的命名空間;
  • 定義 Aspect 類時沒法在註解上一併定義要切入的目標;

以上列舉了一些 1.1 下 AOP 的限制和不足,而在 2.0 版本下,咱們對底層的邏輯進行了重構,上面這些問題所有都被解決掉了,其中最具想象空間的是經過新的 AOP 功能,你能夠對幾乎全部的類和註解進行動態的切入了,不管是經過 new 實例化出來的對象仍是經過 DI 建立出來的對象,不管是切入了這個類的父類仍是更深的繼承層次,不管是 final 類仍是一個普通類。緩存

簡而言之,在新的機制下,Hyperf 會在啓動時掃描全部的掃描域,並掃描代碼獲得全部類的 AST 抽象語法樹,並從中解析全部與 AOP 相關的元數據,根據這些元數據來對要被代理的類進行 AST 節點信息的修改,並注入 AOP 相關的邏輯,最終經過 PHP 的 Autoload 機制,在實例化一個類並進行自動加載時,ClassLoader 返回通過修改後的類文件。微信

那麼用正向的角度來描述這個功能的變動以下:併發

  • AOP 能夠做用於  new 關鍵詞建立的對象;
  • AOP 能夠做用於  Final 類;
  • 您能夠在構造函數中使用  @Inject 和  @Value 註解標記的屬性值;
  • 代理類的類名和繼承關係與原類一致;
  • 對父類進行 AOP 切入,子類一樣生效;
  • AOP 代理類緩存和註解緩存能夠自動識別是否須要從新生成;
  • 經過  new 關鍵詞建立的對象, @Inject 和  @Value 註解標記的屬性值能夠生效;
  • 可在  trait 中使用  @Inject 和  @Value 註解,並做用於  use 的類;
  • PHP 8 下使用  @Inject 註解時可經過強類型聲明替代  @var 註解聲明;
  • 提供了註解全局引入機制,以達到在使用註解時容許不引入對應的命名空間;
  • 在定義 Aspect 時可直接在  @Aspect 註解上定義要切入的目標類和註解;
  • Aspect 增長了  priority 優先級屬性,可定義多個 Aspect 類的優先級;
  • 使用依賴懶加載功能時無需再註冊  Hyperf\Di\Listener\LazyLoaderBootApplicationListener 監聽器;
  • 新增  annotations.scan.class_map 配置,經過該配置能夠直接將任意類替換爲你指定的類;

支持 Coroutine Server 協程服務

在 Swoole 4.4 版本時新增了 Coroutine Server,經過該功能能夠經過協程的形式來運行 Server,也就意味着能夠在一個進程下同時運行多個不一樣協議的 Server 來提供服務,這樣的作法更加的協程,且單進程的模型對 Docker 和 Kubernetes 更加友好,經過調整 Pod 的數量便可對應到真實的進程數;
在 Hyperf 2.0 版本,咱們也對 Coroutine Server 進行了支持,您可經過在 config/autoload/server.php 配置文件中添加一個 type => Hyperf\Server\CoroutineServer::class 配置便可切換到 Coroutine Server 的運行模式去。同時一些本來要使用自定義進程來實現功能的場景,如配置中心的配置拉取、服務監控的數據提供、消息隊列消費者的消費等,咱們的提供了對應的協程模式的運行模式,最終只須要啓動一個進程便可完成全部以前須要多個進程才能完成的事情。異步

增長 ResponseEmitter 機制

在 1.1 版本下,咱們只能在 HTTP Server 中返回由 hyperf/http-message[1] 組件或 hyperf/http-server[2] 組件提供的 Response 對象,但其它一樣遵循了 PSR-7 標準的 Response 卻沒法正常響應,好比 Guzzle 客戶端請求後得到的 Response 對象,在 1.1 下須要轉換爲 Hyperf 的 Response 對象才能正確響應客戶端請求。而在 2.0 版本下,經過 ResponseEmitter 機制,您能夠直接返回任意符合 PSR-7 標準的 Response 對象,以得到更強的兼容性。

增長 Reactive-X 組件

hyperf/reactive-x[3] 組件提供了 Swoole/Hyperf 環境下的 ReactiveX 集成。關於 ReactiveX,微軟給的定義是,Rx 是一個函數庫,讓開發者能夠利用可觀察序列和 LINQ 風格查詢操做符來編寫異步和基於事件的程序,使用 Rx,開發者能夠用 Observables 表示異步數據流,用 LINQ 操做符查詢異步數據流, 用 Schedulers 參數化異步數據流的併發處理,Rx 能夠這樣定義:Rx = Observables + LINQ + Schedulers。而 Reactivex.io[4] 給的定義是,Rx 是一個使用可觀察數據流進行異步編程的編程接口,ReactiveX 結合了觀察者模式、迭代器模式和函數式編程的精華。

經過該組件,您能夠在 Hyperf 中實現響應式編程的範式,爲您的應用提供更多的可能性。

統一 HTTP 異常

在 1.1 版本下,HTTP Server 在處理如 路由未找到(404)請求方法不容許(405) 等 HTTP 異常時,是在 Dispatcher 中提供對應的方法,並直接響應 Response 結果,若是須要自定義對應的響應結果,則須要經過 DI 來重寫 Dispatcher 類的對應方法。而在 2.0 版本下,咱們對異常的處理方式進行了統一,統一拋出 Hyperf\HttpMessage\Exception\HttpException 異常類的子類,並統一由默認提供的 Hyperf\HttpServer\Exception\Handler\HttpExceptionHandler 來處理響應的結果,這樣一來用戶即可以很是便捷的經過 ExceptionHandler 來對異常響應進行統一的處理了。

升級到 2.0 版本

從如今的 1.1 版本升級到 2.0 版本,也是一件很是輕鬆的事情,咱們提供了一份詳盡的 2.0 升級指南[5] 來指引您完成對應的升級動做,具體可查閱該升級指南;

更多

以上只是筆者本人最爲期待的功能迭代,只是冰山一角,2.0 版本還包含了大量的細節更新以及新功能,具體能夠查閱 版本更新記錄[6] 得到更多的細節信息。

總的來講,2.0 是一個充滿了想象空間的版本,它提供了遠超原來的可能性,咱們能夠在 Hyperf 上、在 Swoole 上、在 PHP 上,去想、去作更多原來未曾深思過的事情。

外部連接

[1] 

hyperf/http-message: https://github.com/hyperf/http-message

[2] 

hyperf/http-server: https://github.com/hyperf/http-server

[3] 

hyperf/reactive-x: https://github.com/hyperf/reactive-x

[4] 

Reactivex.io: http://reactivex.io

[5] 

2.0 升級指南: https://www.hyperf.wiki/#/zh-cn/upgrade/2.0

[6] 

版本更新記錄: https://www.hyperf.wiki/#/zh-cn/changelog


本文分享自微信公衆號 - PHP開源Hub(php_open)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索