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