Hyperf 如何快速釋放 DB 連線

李銘昕發表於2020-12-13

HyperfDatabase 連線池的設計,是在 defer 中釋放連線到連線池,那麼就會出現一種情況。

// 讀取使用者資訊
$user = User::query()->find(1);

// 請求第三方介面
$client->request($user);

// 儲存使用者資訊
$user->save();

以上場景,就會導致 DB 連線一直在當前協程的上下文中,雖然中間請求第三方介面,耗時了很久,但其他協程都無法拿到當前的 DB 連線。這就導致,連線池內的連線數會被迅速消耗,
一旦時間過長,其他請求可能就會出現連線耗盡的異常。

顯而易見,我們只需要讓讀取使用者資訊的邏輯,跑在子協程中,然後配合 Channel 阻塞當前協程即可。

v2.1 裡已經實現了這個方法,v2.0 中我們可以匯入以下元件

composer require gemini/waiter

然後我們可以呼叫 wait() 方法,達成這個效果。

// 讀取使用者資訊
$user = wait(function() {
    return User::query()->find(1);
});

// 請求第三方介面
$client->request($user);

// 儲存使用者資訊
$user->save();

寫在最後

Hyperf 是基於 Swoole 4.5+ 實現的高效能、高靈活性的 PHP 協程框架,內建協程伺服器及大量常用的元件,效能較傳統基於 PHP-FPM 的框架有質的提升,提供超高效能的同時,也保持著極其靈活的可擴充套件性,標準元件均基於 PSR 標準 實現,基於強大的依賴注入設計,保證了絕大部分元件或類都是 可替換 與 可複用 的。

框架元件庫除了常見的協程版的 MySQL 客戶端、Redis 客戶端,還為您準備了協程版的 Eloquent ORM、WebSocket 服務端及客戶端、JSON RPC 服務端及客戶端、GRPC 服務端及客戶端、Zipkin/Jaeger (OpenTracing) 客戶端、Guzzle HTTP 客戶端、Elasticsearch 客戶端、Consul 客戶端、ETCD 客戶端、AMQP 元件、Apollo 配置中心、阿里雲 ACM 應用配置管理、ETCD 配置中心、基於令牌桶演算法的限流器、通用連線池、熔斷器、Swagger 文件生成、Swoole Tracker、Blade 和 Smarty 檢視引擎、Snowflake 全域性ID生成器 等元件,省去了自己實現對應協程版本的麻煩。

Hyperf 還提供了 基於 PSR-11 的依賴注入容器、註解、AOP 面向切面程式設計、基於 PSR-15 的中介軟體、自定義程式、基於 PSR-14 的事件管理器、Redis/RabbitMQ 訊息佇列、自動模型快取、基於 PSR-16 的快取、Crontab 秒級定時任務、Translation 國際化、Validation 驗證器 等非常便捷的功能,滿足豐富的技術場景和業務場景,開箱即用。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
Any fool can write code that a computer can understand. Good programmers write code that humans can understand.

相關文章