mysqli 擴(kuò)展和持久化連接

從 PHP 5.3 mysqli 擴(kuò)展開(kāi)始支持持久化連接。 持久化連接已經(jīng)在 PDO MYSQL 和 ext/mysql 中提供支持。 持久化連接的目的在于重用客戶(hù)端到服務(wù)器之間的連接, 而不是每次在需要的時(shí)候都重新建立一個(gè)連接。 由于持久化連接可以將已經(jīng)建立的連接緩存起來(lái),以備后續(xù)的使用, 所以省去了建立新的連接的開(kāi)銷(xiāo), 因此可以帶來(lái)性能上的提升。

不像 mysql 擴(kuò)展,mysqli 沒(méi)有提供一個(gè)特殊的方法用于打開(kāi)持久化連接。 需要打開(kāi)一個(gè)持久化連接時(shí),你必須在 連接時(shí)在主機(jī)名前增加p:。

使用持久化連接也會(huì)存在一些風(fēng)險(xiǎn), 因?yàn)樵诰彺嬷械倪B接可能處于一種不可預(yù)測(cè)的狀態(tài)。 例如,如果客戶(hù)端未能正常關(guān)閉連接, 可能在這個(gè)連接上殘留了對(duì)庫(kù)表的鎖, 那么當(dāng)這個(gè)連接被其他請(qǐng)求重用的時(shí)候,這個(gè)連接還是處于 有鎖的狀態(tài)。 所以,如果要很好的使用持久化連接,那么要求代碼在和數(shù)據(jù)庫(kù)進(jìn)行交互的時(shí)候, 確保做好清理工作,保證被緩存的連接是一個(gè)干凈的,沒(méi)有殘留的狀態(tài)。

mysqli 擴(kuò)展的持久化連接提供了內(nèi)建的清理處理代碼。 mysqli 所做的清理工作包括:

  • 回滾處于活動(dòng)狀態(tài)的事務(wù)

  • 關(guān)閉并且刪除臨時(shí)表

  • 對(duì)表解鎖

  • 重置會(huì)話(huà)變量

  • 關(guān)閉預(yù)編譯 SQL 語(yǔ)句(在PHP中經(jīng)常發(fā)生)

  • 關(guān)閉處理程序

  • 釋放通過(guò) GET_LOCK() 獲得的鎖

這確保了將連接返回到連接池的時(shí)候, 它處于一種“干凈”的狀態(tài),可以被其他客戶(hù)端進(jìn)程所使用。

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)閉。

注意:

mysqli 擴(kuò)展在使用 MySQL Native Driver 或 Mysql Client Library(libmysql)時(shí)都支持持久化連接。