使用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技術交流群
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/90252.html
標籤:AI
