mysqli 擴展和持久化連接

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

不像 mysql 擴展,mysqli 沒有提供一個特殊的方法用于打開持久化連接。 需要打開一個持久化連接時,你必須在 連接時在主機名前增加p:。

使用持久化連接也會存在一些風險, 因為在緩存中的連接可能處于一種不可預測的狀態(tài)。 例如,如果客戶端未能正常關閉連接, 可能在這個連接上殘留了對庫表的鎖, 那么當這個連接被其他請求重用的時候,這個連接還是處于 有鎖的狀態(tài)。 所以,如果要很好的使用持久化連接,那么要求代碼在和數(shù)據(jù)庫進行交互的時候, 確保做好清理工作,保證被緩存的連接是一個干凈的,沒有殘留的狀態(tài)。

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

  • 回滾處于活動狀態(tài)的事務

  • 關閉并且刪除臨時表

  • 對表解鎖

  • 重置會話變量

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

  • 關閉處理程序

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

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

mysqli 擴展 通過自動調(diào)用 C-API 函數(shù) mysql_change_user() 來完成這個清理工作。

自動清理的特性有優(yōu)點也有缺點。 優(yōu)點是程序員不再需要擔心附加的清理代碼, 因為它們會自動調(diào)用。 然而缺點就是 性能 可能會 慢一點, 因為每次從連接池返回一個連接都需要執(zhí)行這些清理代碼。

這個自動清理的代碼可以通過在編譯 php 時定義 MYSQLI_NO_CHANGE_USER_ON_PCONNECT 來關閉。

注意:

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