mysqli擴(kuò)展的持久化連接在PHP5.3中被引入。支持已經(jīng)存在于PDO MYSQL 和ext/mysql中。持久化連接背后的思想是客戶端進(jìn)程和數(shù)據(jù)庫(kù)之間的連接可以通過(guò)一個(gè)客戶端進(jìn)程來(lái)保持重用, 而不是多次的創(chuàng)建和銷毀。這降低了每次需要?jiǎng)?chuàng)建一個(gè)新連接的開(kāi)銷,未使用的連接被緩存起來(lái)并且準(zhǔn)備隨時(shí)被重用。
不像mysql擴(kuò)展,mysqli沒(méi)有提供一個(gè)特殊的方法用于打開(kāi)持久化連接。需要打開(kāi)一個(gè)持久化連接時(shí),你必須在 連接時(shí)在主機(jī)名前增加p:。
使用持久化連接的問(wèn)題在于它們可能在客戶端處于不可預(yù)知的狀態(tài)。比如,一個(gè)表鎖可能在客戶端意外終止之前被激活。 一個(gè)新的客戶端進(jìn)程重用這個(gè)持久化連接就會(huì)"按照原樣"得到這個(gè)連接。這樣,一個(gè)新的客戶端進(jìn)程 為了更好的使用持久化連接,就需要做任何可能的清理工作,這樣就增加了對(duì)程序員的負(fù)擔(dān)。
mysqli擴(kuò)展的持久化連接提供了內(nèi)建的清理處理代碼。mysqli 所做的清理工作包括:
-
回滾活動(dòng)的事務(wù)
-
關(guān)閉并且刪除臨時(shí)表
-
對(duì)表解鎖、
-
重置會(huì)話變量
-
關(guān)閉prepared語(yǔ)句(在PHP中經(jīng)常發(fā)生)
-
關(guān)閉處理程序
-
釋放通過(guò)GET_LOCK()獲得的鎖
這確保了從連接池返回的持久化連接在客戶端進(jìn)程使用它之前處于干凈的狀態(tài)。
mysqli擴(kuò)展通過(guò)自動(dòng)的調(diào)用C-API函數(shù)mysql_change_user() 來(lái)完成這個(gè)清理工作。
自動(dòng)清理的特性有優(yōu)點(diǎn)也有缺點(diǎn)。優(yōu)點(diǎn)是程序員不再需要擔(dān)心附加的清理代碼,因?yàn)樗鼈儠?huì)自動(dòng)調(diào)用。然而缺點(diǎn)就是 代碼可能會(huì)潛在的慢一點(diǎn),因?yàn)槊看螐倪B接池返回一個(gè)連接都需要執(zhí)行這些清理代碼。
這個(gè)自動(dòng)清理的代碼可以通過(guò)在編譯php時(shí)定義MYSQLI_NO_CHANGE_USER_ON_PCONNECT 來(lái)關(guān)閉。