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