Swoole協程模式實現Mysql連線池

2021-10-04 08:07:09 字數 2356 閱讀 2849

永不斷開,要求我們的這個程式是乙個常駐記憶體的程式。資料庫連線池(connection pooling)是程式啟 動時建立足夠的資料庫連線,並將這些連線組成乙個連線池,由程式動態地對池中的連線進行申請,使用,釋放。

當併發量很低的時候,連線可以臨時建立,但當服務吞吐達到幾百、幾千的時候,頻繁建立連線 connect銷毀連線 close就有可能會成為服務的乙個瓶頸,那麼當服務啟動的時候,先建立好若干個連線並存放於乙個佇列中,當需要使用時從佇列中取出乙個並使用,使用完後再反還到佇列去,而對這個佇列資料結構進行維護的,就是連線池。

必須在協程模式下

pool.php

<?php

class

pdopool

/** * @return pdopool|null

*/public

static

function

getinstance()

return self:

:$instance;}

/** * 連線池初始化

*/protected

function

init()

}public

function

getconnection()

private

function

getconnectionbychannel()

// 小於連線池內最小連線數if(

$this

->

count

<

$this

->

minactive

)// 取出連線

$connection

=null;if

(!$this

->

channel

->

isempty()

)//檢測連線是否正常if(

$connection

!==null

&&$connection

['connection'

]instanceof

pdo)

//未取出連線 判斷是否大於最大連線數進行建立if(

$this

->

count

<

$this

->

maxactive

)//檢視協程掛起數

$stats

=$this

->

channel

->

stats()

;if($this

->

maxwait

>0&&

$stats

['consumer_num'

]>=

$this

->

maxwait

)//重新取出連線

$connection

=$this

->

channel

->

pop(

$this

->

maxwaittime);

if($connection

==false

)return

$connection;}

private

function

createconnection()

catch

(\throwable

$throwable)}

private

function

popconnection()

return

null;}

public

function

freeconnection

($connection)}

/** * 自動**空閒連線

*/private

function

recovery()

if((time()

-$connection

['lastusedtime'])

>

$this

->

maxidletime

)else}}

);}private

function

__clone()

}

這裡生成的是pdo連線池同理可自行修改createconnection方法生成其它連線池

可用ast語法樹進行多種連線池配置

大佬勿噴 嘿嘿!

swoole使用協程

協程 協程可以理解為純使用者態的執行緒,其通過協作而不是搶占來進行切換。相對於程序或者執行緒,協程所有的操作都可以在使用者態完成,建立和切換的消耗更低。swoole可以為每乙個請求建立對應的協程,根據io的狀態來合理的排程協程,這會帶來了以下優勢 開發者可以無感知的用同步的 編寫方式達到非同步io的...

swoole之協程channel元素個數

channel用於程序內跨協程通訊,按照角色分為生產協程和消費協程。生產協程,在channel已滿時,會被掛起 消費協程,在channel為空是,也會被掛起。chan new swoole coroutine channel 50 function t4 swoole coroutine chann...

gevent實現協程

1 yield實現 import time def task 1 while true print 1 time.sleep 0.1 yield def task 2 while true print 2 time.sleep 0.1 yield def main t1 task 1 建立迭代器 t...