1. 程式人生 > 實用技巧 >通過Swoole2協程特性實現的MySQL連線池

通過Swoole2協程特性實現的MySQL連線池

使用Swoole2的\ Swoole \ Coroutine \ MySQL建立連線,通過靜態類和靜態成員屬性維護連線池,不同協程可以共享該連線池。

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

  • \Swoole\Coroutine::resume($ name):從$ name域名中恢復一個掛起的協程執行;

  • \Swoole\Coroutine::suspend($ name):將當前協程掛軸向$ name本身上。

限制條件

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

  • 可能存在各個worker程序連線池最大化不同(依賴業務實現)。

優點

  • 與獨立的連線池(worker程序間可共享的連線池實現)對比,無進展間通訊開銷;

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

使用方法

/ ** 
*初始化連線池
* 
* @param array $ connsConfig配置陣列
* [ 
*'connName1'=> [ 
*'serverInfo'=> ['host'=>'127.0.0.1','user'=>'測試','password'=>'pass','database'=>'tt','charset'=>'utf8'],// \ Swoole \ Coroutine \ MySQL的連線引數
*'maxSpareConns'=> 5,/ /最大連結連線數
*'maxConns'=> 10,//最大連線數
*],
*'connName2'=> [ 
*'serverInfo'=> ['host'=>'127.0.0.2','user'= >'test','password'=>'pass','database'=>'tt','charset'=>'utf8'],// \ Swoole \ Coroutine \ MySQL的連線引數
*'maxSpareConns'=> 5,//最大連線數
*'maxConns'=> 10,//最大連線數
*],
*] 
* / 
Swoole \ Coroutine\ Pool \ MySQLPool :: init(陣列$ connsConfig)

/ ** 
*回收連線,該連線必須是從連線池中獲取的連線
** 
@param \ Swoole \ Coroutine \ MySQL $ conn從連線池中獲取的連線
* / 
Swoole \ Coroutine \ Pool \ MySQLPool :: recycle( \ Swoole \ Coroutine \ MySQL  $ conn)

/ ** 
*從連線池中獲取一條連線
* 
* @param string $ connName init時配置的連線,根據連線名稱獲取對應的連線
* @return \ Swoole \ Coroutine \ MySQL返回一個連線例項
* / 
Swoole \ Coroutine \ 池 \ MySQLPool :: 提取($ connName)

使用示例

<?php 
需要 'MySQLPool.php' ;
使用 Swoole \ Coroutine \ Pool \ MySQLPool ;

$ server =新的 Swoole \ Http \ Server( “ 127.0.0.1”, 9502, SWOOLE_BASE);
$伺服器 - >組([
         'worker_num' => 1,
]);
$伺服器 - >上( '請求',功能( $請求, $響應){
         MySQLPool :: INIT([
                 '測試' => [
                         'serverInfo' => [ '主機' => '192.168.244.128' , “使用者' => 'mha_manager', 'password' => 'mhapass', 'database' => 'tt', 'charset' =>'utf8' ],
                        'maxSpareConns' => 5,
                         'maxConns' => 10
                ],
        ]);
        $ swoole_mysql = MySQLPool :: fetch( 'test');
        $ ret = $ swoole_mysql- >查詢( 'select sleep(1)');
        MySQLPool ::回收( $ swoole_mysql);
        $ response- > end( 'Test End');
});
$ server- > start();

壓測命令:ab -c 20 -n 100 -s 100 http://127.0.0.1:9502/,20併發,共100個請求。

壓測結果:

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

壓測後連線情況,設定了最大數量連線數為5,所以現在沒有客戶端請求時,大部分連線數維持為5:

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

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

點關注,不迷路

好了各位,以上就是這篇文章的全部內容了,能看到這裡的人呀,都是人才。之前說過,PHP方面的技術點很多,也是因為太多了,實在是寫不過來,寫過來了大家也不會看的太多,所以我這裡把它整理成了PDF和文件,如果有需要的可以

點選進入暗號: PHP+「平臺」


更多學習內容可以訪問【對標大廠】精品PHP架構師教程目錄大全,只要你能看完保證薪資上升一個臺階(持續更新)

以上內容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務程式碼寫多了沒有方向感,不知道該從那裡入手去提升,對此我整理了一些資料,包括但不限於:分散式架構、高可擴充套件、高效能、高併發、伺服器效能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell指令碼、Docker、微服務、Nginx等多個知識點高階進階乾貨需要的可以免費分享給大家,需要的可以加入我的 PHP技術交流群