首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP MySQL 永久連接優化與風險控制:線程池、崩潰檢測與併發安全

     編輯:PHP 相關知識

永久連接原理

mysql_pconnect() / mysqli::real_connect(..., MYSQLI_CLIENT_PERSISTENT) 將連接放入進程池,下次請求直接復用,省去 TCP 握手、認證、字符集協商開銷。

三大風險與對策

風險現象緩解方案
數據庫重啟/崩潰連接池持有失效句柄,後續請求報 "MySQL server has gone away"1. 註冊 mysqli::ping() 健康檢查(每 N 次請求)
2. 設置 wait_timeout、interactive_timeout 短於連接池回收週期
Apache 線程耗盡MaxClients 已滿,新請求排隊/拒絕1. 調大 MaxClients / ThreadsPerChild
2. 監控 show processlist 睡眠連接數,設置 mysql.allow_persistent=Off 禁用
併發髒讀/事務洩漏請求 A 開啟事務未提交,請求 B 復用同連接看到未提交數據1. 請求結束強制 ROLLBACK / COMMIT
2. 關鍵業務禁用永久連接,使用短連接

最佳實踐配置

; php.ini
mysql.allow_persistent = On
mysql.max_persistent = -1      ; 無限制,視 Apache 進程數而定
mysql.max_links = -1           ; 總連接數上限
mysqli.allow_persistent = On
mysqli.max_persistent = -1
mysqli.max_links = -1
pdo_mysql.default_socket = /tmp/mysql.sock

健康檢查中間件範例

function ensureDbAlive(mysqli $mysqli): void {
    static $counter = 0;
    if (++$counter % 50 === 0) { // 每 50 次請求檢查一次
        if (!$mysqli->ping()) {
            $mysqli->close();
            throw new RuntimeException('DB connection lost, will reconnect next request');
        }
    }
}

建議

  • 中小型項目、讀多寫少、連接數可控 → 開啟永久連接提升吞吐。
  • 高併發寫入、長事務、微服務架構 → 禁用永久連接,改用短連接 + 連接池。
  • PHP 7.2+ 推薦使用 mysqli::real_connect 顯式控制持久標誌,避免隱式行為。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved