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

PHP 連接 MySQL:mysql_connect vs mysql_pconnect 深度對比與選型指南(重複條目已合併)

     編輯:MySQL 綜合教學

PHP 連接 MySQL:mysql_connect vs mysql_pconnect 深度對比與選型指南

注意: `mysql_*` 系列函數自 PHP 5.5 棄用,PHP 7.0 移除。新項目請使用 mysqli 或 PDO。本文僅供維護舊代碼參考。

核心差異對比

維度mysql_connect()mysql_pconnect()
連接建立每次腳本執行新建連接首次建立,後續復用進程池中的持久連接
連接關閉腳本結束自動關閉腳本結束不關閉,歸還連接池
資源佔用短連接,併發高時頻繁握手長連接,減少握手開銷,但佔用 MySQL 連接數
適用場景低併發、PHP 與 MySQL 同機/內網高併發、跨網段、連接建立延遲明顯

mysql_pconnect() 使用陷阱(必讀)

1. 表鎖殘留

持久連接不關閉,LOCK TABLES 未顯式 UNLOCK 會導致後續請求永久阻塞。

2. 臨時表不釋放

連接復用時,上一個請求創建的臨時表仍存在,可能導致表不存在或數據洩露。

3. 會話變量汙染

SET SESSION sql_mode=...、用戶變量 @var 會在請求間殘留。

4. Apache Prefork MPM 連接爆炸

每個 Apache 子進程維護獨立連接池,併發上漲時總連接數 = 子進程數 × 連接池大小,極易擊穿 max_connections。

最佳實踐建議

  1. 新項目: 直接用 mysqli (面向過程/物件) 或 PDO,支援預處理、事務、多結果集
  2. 舊項目維護:
    • 低併發(< 100 QPS):統一改 mysql_connect
    • 高併發:遷移至 mysqli + 連接池(如 mysqli::real_connect + 持久連接參數 p: 前綴)
  3. 連接池化: PHP-FPM 無原生連接池,生產環境建議引入 ProxySQL 或 PgBouncer (PostgreSQL) 側車代理

mysqli 持久連接正確姿勢

$mysqli = new mysqli('p:localhost', 'user', 'pass', 'db', 3306);
// 或
$mysqli = mysqli_connect('p:localhost', 'user', 'pass', 'db', 3306);

p: 前綴啟用持久連接,PHP 進程結束時自動歸池,重啟進程時重新驗證連接有效性。

總結

「持久連接是把雙刃劍:用得好減少握手延遲,用不好耗盡連接數、引發詭異 Bug。現代架構下,交給專業代理(ProxySQL)管理連接池,應用層保持短連接,才是正道。」

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