注意:mysql_* 系列函數自 PHP 5.5 棄用、PHP 7.0 移除。現代專案請改用 mysqli 或 PDO。本文僅供維護舊專案或理解歷史機制參考。
| 特性 | mysql_connect | mysql_pconnect |
|---|---|---|
| 連線類型 | 短連線(腳本結束自動斷開) | 持久連線(進程結束才釋放) |
| 建立開銷 | 每次 TCP/Unix Socket 握手 | 複用既有連線,省去握手 |
| 資源佔用 | 用完即釋放 | 常駐進程記憶體,佔用連線池 |
| 適用模式 | 所有模式(CGI、模組) | 僅 Apache 模組模式有效 |
CGI 每請求啟動新進程,執行完銷毀進程,持久連線隨進程消失,退化為短連線。
假設:
- MySQL max_connections = 10
- Apache MaxRequestWorkers = 100(100 子進程)
情境:
1. 10 個請求分派給 10 不同子進程 → 各建立 1 條持久連線 → MySQL 滿 10 連線
2. 第 11 個請求分派給第 11 個子進程 → 嘗試建立第 11 條持久連線 → MySQL 拒絕 → 應用報錯
結論:持久連線數上限 = Apache 子進程數 × 每進程連線數,極易撞上 MySQL 連線上限。
| 地雷 | 後果 | 防範 |
|---|---|---|
腳本中鎖表 LOCK TABLES 未釋放 | 下次複用該連線時永久等待死鎖 | register_shutdown_function 註冊清理回調 |
| 事務未提交/回滾 | 下次請求繼承髒事務,資料不一致 | 同上,關機函數強制 ROLLBACK |
| 連線狀態殘留(字符集、SQL_MODE、臨時表) | 後續查詢行為異常 | 每請求開頭重置狀態或避免持久連線 |
mysqli / PDO + 連線池中介軟體(如 ProxySQL、PgBouncer 對應 PostgreSQL)mysqli::real_connect 持久連線選項(MYSQLI_CLIENT_PERSISTENT)謹慎使用mysql_pconnect 曾是效能優化利器,但隨著架構演進(連線池中介、無狀態微服務),其風險大於收益。新專案勿用,舊專案逐步遷移。