在 PHP 開發中連接 MySQL 資料庫時,開發者常面臨一個選擇:使用短暫連接(非持久連接)還是持久連接(Persistent Connection)。短暫連接在腳本執行結束後自動關閉,而持久連接則在請求結束後保持開啟,供下一次請求重複使用,避免重複建立連接的開銷。
持久連接的核心優在於減少連接建立的延遲。每次建立 TCP 連接、進行 SSL 握手、驗證身份都需要時間,高併發場景下這些開銷會累積。持久連接透過連接池機制,讓 Apache 的工作進程/執行緒重用已建立的連接,顯著降低響應時間。
當 MySQL 服務重啟或崩潰時,持久連接不會自動感知,下一次使用時會報錯。解決方案是實作連接健康檢查機制:在執行查詢前先發送簡單的 SELECT 1 或 PING 指令,若失敗則重新建立連接。
Apache 的 MaxRequestWorkers(舊版為 MaxClients)限制了同時執行的工作進程數。若持久連接數超過 MySQL 的 max_connections 或 Apache 的工作進程上限,會導致服務拒絕。建議:
httpd.conf 中的 MaxRequestWorkers 參數max_connections 為略高於 Apache 最大工作進程數的值mysqli.reconnect 或 PDO 的 ATTR_PERSISTENT 並配合連接超時設定同一持久連接若被多個請求交替使用,且未正確重置會話狀態(如事務、臨時表、用戶變數、字符集設定),可能導致髒讀或邏輯錯誤。PHP 5.3+ 的 mysqli_change_user() 或 PDO 重新認證可重置連接狀態。
Threads_connected、Aborted_connects、Connection_errors_internalwait_timeout、interactive_timeout、PHP 端的 mysqlnd.net_read_timeout總結:持久連接在特定場景(長運行 CLI 腳本、低併發、單一應用獨佔資料庫)有效,但現代高併發 Web 架構下,外部連接池 + 短連接通常是更穩健的選擇。