您好,登錄后才能下訂單哦!
本篇內容介紹了“php如何實現連接池”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
什么是連接池
在實際應用開發中,一般會有很多訪問下游的需求(下游包括但不限于服務/數據庫/緩存),在并發量很低的時候,通常不會有任何問題的,但是當服務單機QPS達到幾百、幾千、甚至上萬的時候,如果每一次訪問還是必須經歷建立連接=》收發請求=》關閉連接=》釋放資源等步驟,系統的性能必然會急劇下降,甚至會導致系統崩潰。
連接池正是是解決這個問題最常用的方法,其思想非常簡單,即是在服務啟動的時候,先建立好若干連接,當有請求過來,就從中取出一個,執行下游操作,執行完再放回,從而避免反復的建立和銷毀連接,以提升性能。
如何實現連接池
連接池是一個獨立的服務,需要常駐進程。一個完整的連接池操作,通常要經歷如下幾步:
(1)建立連接池對象(服務啟動)。
(2)按照事先指定的參數創建初始數量的連接(即:空閑連接數)。
(3)對于一個訪問請求,直接從連接池中得到一個連接。如果連接池對象中沒有空閑的連接,且連接數沒有達到最大(即:最大活躍連接數),創建一個新的連接;如果達到最大,則設定一定的超時時間,來獲取連接。
(4)運用連接訪問服務。
(5)訪問服務完成,釋放連接(此時的釋放連接,并非真正關閉,而是將其放入空閑隊列中。如實際空閑連接數大于初始空閑連接數則釋放連接)。
(6)釋放連接池對象(服務停止、維護期間,釋放連接池對象,并釋放所有連接)。
Java對連接池比較友好,有著很多成熟的解決方案,如DBCP 、C3P0、Druid等。而PHP在這方面就相對較弱,雖然Mysql提供了長連接的API,但在PHP機器數量較多,規模較大的情況下,mysql_pconnect非但不能節約MySQL資源,反而會加劇數據庫的負荷。這主要是由于它需要依賴apache或fpm,比如,假設有100臺PHP的應用服務器,每個機器需要啟動100個apache或fpm工作進程,每個進程都會產生一個長連接到MySQL,這樣一共會產生1萬個My SQL連接。大家都知道,MySQL是每個連接會占用1個線程,如果有1萬個連接,那MYSQL就需要創建1萬個線程,這樣大量的系統資源會被浪費在線程間上下文切換上。實際上,你的業務代碼中并不是所有地方都在做數據庫操作,所以,如果創建了這么多的連接,但是很多都是空閑的,那這樣就會很浪費資源。
鑒于此,PHP要想獨立解決連接復用的問題,那必須實現自己的連接池。所幸,PHP擴展swoole剛好可以做到這一點,利用swoole提供的task功能可以很方便做出一個連接池來。
如下是使用swoole實現連接池的部分代碼:
通過這一段代碼,PHP就可以實現連接池,解決連接不可復用的問題。
當然以上只是一個示例,要想在生產環境中使用,僅僅這樣肯定不夠。這里推薦一個現成的工具——SMProxy。
SMProxy是一個基于mysql協議,使用swoole 開發的mysql數據庫連接池。它有如下特色:
支持讀寫分離
支持數據庫連接池,能夠有效解決 PHP 帶來的數據庫連接瓶頸
支持 SQL92 標準
采用協程調度
支持多個數據庫連接,多個數據庫,多個用戶,靈活搭配
遵守 MySQL 原生協議,跨語言,跨平臺的通用中間件代理
支持 MySQL 事務
支持 HandshakeV10 協議版本
完美兼容 MySQL5.5 - 8.0
兼容各大框架,無縫提升性能
另外,也支持Laravel、ThinkPHP等國內主流框架。
所以,如果你正在使用PHP,而且也想使用連接池,那不妨看看這個工具。
“php如何實現連接池”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。