當前位置:
首頁 > 知識 > swoole2-mysqlpool:基於 Swoole 2 協程特性實現的 MySQL 連接池

swoole2-mysqlpool:基於 Swoole 2 協程特性實現的 MySQL 連接池

開源地址:https://github.com/yangxikun/swoole2-mysqlpool

基於Swoole2協程特性實現的MySQL連接池

使用Swoole2的SwooleCoroutineMySQL創建連接,通過靜態類和靜態成員屬性維護連接池,不同協程可以共享該連接池。

排隊機制(先進先出)使用協程的特殊功能實現:

:從$name隊列中恢復一個掛起的協程執行;

:將當前協程掛起到$name隊列上。

限制

每個worker都有各自的MySQL連接池,且不同worker之間無法共享彼此的MySQL連接池;

可能存在各個worker進程連接池利用率不同(依賴業務實現)。

優點

與獨立的連接池(worker進程間可共享的連接池實現)對比,無進程間通信開銷;

獨立的連接池需要增加運維成本。

使用方法

/** * 初始化連接池 * * @paramarray$connsConfig 配置數組 * [ * connName1 => [ * serverInfo => [ host => 127.0.0.1 , user => test ,

password => pass , database => tt , charset => utf8 ],

//SwooleCoroutineMySQL的connect參數 * maxSpareConns =>5, //最大空閑連接數 * maxConns =>10, //最大連接數 * ], * connName2 => [ * serverInfo => [ host => 127.0.0.2 ,

user => test , password => pass , database => tt , charset => utf8 ],

//SwooleCoroutineMySQL的connect參數 * maxSpareConns =>5, //最大空閑連接數 * maxConns =>10, //最大連接數 * ], * ] */SwooleCoroutinePoolMySQLPool::init(array$connsConfig)/** * 回收連接,該連接必須是從連接池中獲取的連接 * * @param SwooleCoroutineMySQL $conn 從連接池中獲取的連接 */SwooleCoroutinePoolMySQLPool::recycle(SwooleCoroutineMySQL $conn)/** * 從連接池中獲取一條連接 * * @paramstring$connName init時配置的連接,根據連接名稱獲取對應的連接 * @returnSwooleCoroutineMySQL 返回一個連接實例 */SwooleCoroutinePoolMySQLPool::fetch($connName)使用示例

require MySQLPool.php ;useSwooleCoroutinePoolMySQLPool;$server =newSwooleHttpServer("127.0.0.1",9502, SWOOLE_BASE);$server->set([ worker_num =>1,]);$server->on( Request ,function($request, $response){ MySQLPool::init([ test => [

serverInfo => [ host => 192.168.244.128 ,

user => mha_manager , password => mhapass ,

database => tt , charset => utf8 ],

maxSpareConns =>5,

maxConns =>10], ]); $swoole_mysql = MySQLPool::fetch( test ); $ret = $swoole_mysql->query( select sleep(1) ); MySQLPool::recycle($swoole_mysql); $response->end( Test End );});$server->start();

壓測命令: ,20並發,共100個請求。

壓測結果:

壓測時連接情況,20並發,最大連接數限制為10,所以最多只會與資料庫建立10條連接:

壓測後連接情況,設置了最大空閑連接數為5,所以現在沒有客戶端請求時,空閑連接數維持為5:

這裡服務端只有1個worker進程在工作,完成100個請求,且每個請求的SQL查詢是sleep 1秒,花了約11秒,如果是php-fpm+mysqli這樣的模式,1個worker進程,那麼得花100秒。

所以這正是協程的優勢所在,利用非阻塞IO+協程切換,1個worker進程能同時處理多個客戶端請求,大大提高了吞吐量。

點擊展開全文

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 PHP技術大全 的精彩文章:

Deployer 5.0.0 發布,PHP 編寫應用部署工具
symfony中使用NelmioApiDocBundle進行API管理
為什麼Swoole可以加速php
浮躁的中國企業奴隸化中國年輕人
微服務業務開發三個難題-拆分、事務、查詢(上)

TAG:PHP技術大全 |

您可能感興趣

iOS 代碼使用 C+的zero-cost abstraction 特性
極速體驗:Oracle 18c 下載和Scalable Sequence新特性
Oracle Database 12c In-Memory特性之執行計劃對比
微軟Build 2018:Sets、Cortana將擁有Timeline特性
Pivotal Greenplum 5.3 特性簡介
Pivotal Greenplum 5.4特性簡介
Pivotal Greenplum 5.9 特性簡介
Python中的 property特性
Windows Server 2019新特性:Linux、HCI……
Python3.7新特性:Data Class
Python中的 @property特性
Windows 10上的Google Chrome獲得標籤組特性 可使用滑鼠滾動標籤
微軟Chromium版Edge瀏覽器企業特性公布:支持Windows 10信息保護
Android Studio 3.2新功能特性
微軟Chromium版Edge「替換」Chrome特性一覽
iPhone 11新特性再曝光:或將支持Apple Pencil
比iPhone SE更香 Switch Lite三大特性解析
你可能不知道的 Django Rest Framework 的兩個新特性
Chrome 66 新特性:CSS 類型對象模型,非同步剪貼板 API,AudioWorklet,等
Firefox瀏覽器開始支持Windows 10原生通知特性