mysql连接池
一、導(dǎo)語
連接池在JAVA中應(yīng)用的很廣泛,而在PHP中很少使用。 以Mysql為例,JAVA中使用連接池的原因之一是避免重復(fù)新建、釋放連接資源帶來的開銷。而在PHP中都是直連,因為這部分開銷對于C API而言性能上是沒有問題的。 那么既然PHP直連已經(jīng)沒有性能問題,那為何還要多次一舉開發(fā)mysql的數(shù)據(jù)庫連接池擴(kuò)展呢?因為根本的目的是在于理解PHP的TS(Tthread Safe線程安全)與NTS(Not Thread Safe非線程安全)運行模式,而并非數(shù)據(jù)庫連接池這個功能。二、原理
連接池的基本思想是在系統(tǒng)加載時,初始化默認(rèn)數(shù)量的連接對象存儲在內(nèi)存中,當(dāng)有客戶端需要訪問數(shù)據(jù)庫時,根據(jù)場景選擇是分配、新建、等待、失敗返回連接對象。使用完畢之后,連接將被重新放置回連接池中等待下一個請求的再分配,而不是釋放內(nèi)存。 連接池中連接的建立、釋放都由連接池自身來管理,同時可以通過設(shè)置初始化最小連接數(shù)、最大連接數(shù)、最大空閑時間等來配置連接池。 注:在此擴(kuò)展中,提供了最小連接數(shù)(min_connection)、最大連接數(shù)(max_connection)的設(shè)置
三、實現(xiàn)思路
1.定義全局?jǐn)?shù)組變量dbpoolsdbpools中的元素類型為
[cpp]?view plaincopy
3.定義全局變量db_pools_length(目前擁有鏈接數(shù))、db_pools_use_length(目前被使用的鏈接數(shù)),通過這兩個值來確定分配資源的情景
注:正因為使用全局變量實現(xiàn)連接池,通過修改全局變量的狀態(tài)來選擇資源連接,決定了該擴(kuò)展必須運行在共享全局變量的ZTS(Zend Thread Safe)線程安全模式下。(例如IIS或Apache MPM Worker模式)
如果希望支持多進(jìn)程,可以通過進(jìn)程間通信來設(shè)置全局變量,實現(xiàn)線程池。
實現(xiàn)思路圖:
四、理解PHP線程與進(jìn)程的工作模式
(一)多進(jìn)程工作模式 PHP的多進(jìn)程工作模式以Apache?apxs舉例。 apache啟動時,會fork出N個子進(jìn)程用來等待接受處理客戶端的請求。進(jìn)程之間相互隔離,全局變量也無法直接訪問(可以通過進(jìn)程間通信訪問)。這樣的好處是能夠保證PHP環(huán)境的長時間穩(wěn)定, 即使有部分進(jìn)程因內(nèi)存泄漏而崩潰也不會影響其他進(jìn)程。由于PHP相當(dāng)于粘合劑,它實際相當(dāng)于集合多個庫的API,例如集合了libcurl、libmemcache、libzip等,要保證所有的庫都正常運行是比較困難的。 那么為了保證PHP的高可靠性,這種多進(jìn)程的模式就是首選。
(二)多線程工作模式 PHP的多線程工作模式以IIS舉例。 這種模式下,只有一個進(jìn)程在后臺運行著,所有請求都是通過這一個進(jìn)程來完成。只是在處理每個請求時,會創(chuàng)建獨立的線程來處理。 正是因為使用多線程這種模式,可以直接訪問全局變量得以方便的實現(xiàn)數(shù)據(jù)庫連接池。
六、使用此擴(kuò)展前提條件與方法
1.widnwos下IIS Server或Apache多線程模式,php5.3.* 2.修改php.ini,添加 [my_mysql]my_mysql.host = localhost
my_mysql.user = root
my_mysql.password =?
my_mysql.port = 3306
my_mysql.max_connection = 200 //最大連接數(shù)
my_mysql.min_connection = 100 ?//默認(rèn)最小連接數(shù) 看到這里的配置,能看出來這個數(shù)據(jù)庫連接池擴(kuò)展沒有實現(xiàn)多數(shù)據(jù)源的連接池。因為目的不在連接池本身,所以也沒有特地去寫多數(shù)據(jù)源的功能。 3.修改php.ini,添加 extension=php_my_mysql.dll 4.重啟apache server
七、相關(guān)下載 擴(kuò)展dll下載:php_my_mysql.dll 源碼下載:http://yunpan.cn/QWmEN8PuuRVYN
擴(kuò)展測試結(jié)果
測試配置: [my_mysql]my_mysql.max_connection = 2 //最大連接數(shù)
my_mysql.min_connection = 1 ?//默認(rèn)最小連接數(shù) 使用三個瀏覽器,運行下列測試腳本:
[php]?view plaincopy
測試結(jié)果圖:
返回warning的,是由于連接池資源被占用完,會進(jìn)入等待。如果1.5s仍沒有等待到資源,則返回dbpool is exhushed。
來源:http://blog.csdn.net/a600423444/article/details/8835801
總結(jié)
- 上一篇: .html,.htm和.shtml的区别
- 下一篇: 船长29.60米宽5.50米深1.38米