持久連線的構想是,用戶端程序與資料庫之間的連線可以由用戶端程序重複使用,而不是多次建立和銷毀。由於未使用的連線會被快取並準備好重複使用,因此可以減少每次需要建立新連線的額外負荷。
與 mysql 延伸模組不同,mysqli 並未提供用於開啟持久連線的獨立函式。要開啟持久連線,您必須在連線時在主機名稱前面加上 p:
。
持久連線的問題在於,用戶端可能會將其留在不可預測的狀態。例如,在用戶端意外終止之前,可能會啟用表格鎖定。重複使用此持久連線的新用戶端程序將按原樣取得連線。任何清理工作都需要由新的用戶端程序在其有效利用持久連線之前完成,這增加了程式設計師的負擔。
然而,mysqli
擴充功能的持續連線提供了內建的清理處理程式碼。 mysqli
執行的清理包含:
回滾活躍的交易
關閉並刪除暫存表
解鎖表格
重設工作階段變數
關閉預備語句(在 PHP 中總是會發生)
關閉處理器
釋放使用 GET_LOCK() 取得的鎖定
這確保了持續連線在從連線池返回之前處於乾淨狀態,然後用戶端程序才能使用它們。
mysqli
擴充功能會透過自動呼叫 C-API 函式 mysql_change_user()
來執行此清理。
不過,自動清理功能有利也有弊。優點是程式設計師不再需要擔心添加清理程式碼,因為它會自動呼叫。然而,缺點是程式碼*可能*會稍微慢一些,因為每次從連線池返回連線時都需要執行清理程式碼。
可以透過定義 MYSQLI_NO_CHANGE_USER_ON_PCONNECT
來編譯 PHP,從而關閉自動清理程式碼。
注意事項:
當使用 MySQL 原生驅動程式或 MySQL 用戶端程式庫時,
mysqli
擴充功能支援持續連線。