首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL_connect vs MySQL_pconnect:PHP 連線模式深度比較

     編輯:MySQL 綜合教學

PHP 連接 MySQL:mysql_connect 與 mysql_pconnect 差異全解析

注意:mysql_* 系列函數自 PHP 5.5 棄用、PHP 7.0 移除。現代專案請改用 mysqli 或 PDO。本文僅供維護舊專案或理解歷史機制參考。

核心差異一覽

特性mysql_connectmysql_pconnect
連線類型短連線(腳本結束自動斷開)持久連線(進程結束才釋放)
建立開銷每次 TCP/Unix Socket 握手複用既有連線,省去握手
資源佔用用完即釋放常駐進程記憶體,佔用連線池
適用模式所有模式(CGI、模組)僅 Apache 模組模式有效

持久連線運作機制

  1. PHP 收到請求,檢查當前進程是否已有「相同參數」(同主機、同用戶、同密碼、同資料庫)的持久連線
  2. 有 → 直接複用;無 → 建立新持久連線
  3. 腳本結束時 不關閉 連線,歸還進程連線池
  4. 下一個請求落在同進程 → 秒級複用

CGI 模式下無差異

CGI 每請求啟動新進程,執行完銷毀進程,持久連線隨進程消失,退化為短連線。

Apache Prefork MPM 潛在風險

假設:
- 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、臨時表)後續查詢行為異常每請求開頭重置狀態或避免持久連線

現代最佳實踐

  • 棄用 mysql_pconnect,改用 mysqli / PDO + 連線池中介軟體(如 ProxySQL、PgBouncer 對應 PostgreSQL)
  • PHP-FPM + mysqli:每請求建立短連線,配合 mysqli::real_connect 持久連線選項(MYSQLI_CLIENT_PERSISTENT)謹慎使用
  • 高併發架構:應用層無狀態,連線池由中介層統一管理

總結

mysql_pconnect 曾是效能優化利器,但隨著架構演進(連線池中介、無狀態微服務),其風險大於收益。新專案勿用,舊專案逐步遷移。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved