萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

mysql_connect() vs mysql_pconnect():PHP 連線模式選擇與效能調優完整指南

核心差異一覽

特性mysql_connect()mysql_pconnect()
連線生命週期請求建立 → 請求結束自動關閉請求建立 → 請求結束**不關閉**,放入連線池複用
適用場景低頻、輕量頁面高頻、高併發頁面
資源消耗頻繁建立/銷毀開銷大複用連線,減少開銷,但長期佔用資源
配置需求無特殊調整需調整 MySQL max_connections、Apache 執行緒/進程數、超時設定

深度原理剖析

mysql_connect():短連線模式

  • 每次 PHP 頁面請求建立新連線,腳本結束自動斷開。
  • 適合流量較小、無需調整參數的環境。
  • 簡單、安全、無連線洩漏風險。

mysql_pconnect():持久連線模式

  • 首次請求建立連線,後續請求直接從連線池取用。
  • p = persistent(永久)。
  • 需伺服器級調優:
    • MySQL max_connections ≥ Apache 最大執行緒/進程數。
    • 設定 wait_timeout、interactive_timeout 清理空閒連線。
    • Apache MaxClients/ThreadsPerChild(Windows)或 ServerLimit/MaxRequestWorkers(Linux)需與資料庫連線上限匹配。

實戰坑點:Apache + PHP + mysql_pconnect 導致「Too many connections」

Windows 環境範例

  • Apache:1 主進程 + 1 子進程 + N 執行緒(ThreadsPerChild 500)。
  • 若 500 條執行緒都曾執行過 pconnect 頁面 → 500 條持久連線常駐。
  • MySQL max_connections < 500 → 新請求連線失敗。

Linux 環境

  • Apache Prefork MPM:多進程模式,每進程一條持久連線。
  • 需調整 ServerLimit、MaxRequestWorkers 與 MySQL max_connections 一致。

最佳實踐建議

  1. 優先使用 mysql_connect():現代 PHP(PDO、mysqli)預設即為短連線,配合連線池中介軟體(如 ProxySQL)更靈活。
  2. 極高併發且查詢極簡單:可考慮 pconnect,但**必須**完成全鏈路容量規劃(Web 伺服器執行緒數 = 資料庫最大連線數)。
  3. 靜態化為王:將動態頁面盡可能生成靜態檔案,減少資料庫連線需求,根本解決連線壓力。
  4. 避免混用:同一應用中混用 connect/pconnect 易導致連線洩漏與難以除錯。

持久連線的誤區

持久連線**不提供**: - 用戶會話綁定(Session 綁定) - 事務跨請求保持 - 任何非持久連線無法提供的特殊功能

本質只是「不關閉 TCP 連線」,應用層邏輯完全相同。

結論

除非你完全掌控全棧容量規劃並接受運維複雜度,生產環境強烈建議使用 mysql_connect()(或 PDO/mysqli 短連線)配合應用層連線池。持久連線是雙面刃,用不好會刺傷自己。

copyright © 萬盛學電腦網 all rights reserved