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

MySQL "Server has gone away" 排查實錄:長連線超時與 PHP 短連線修正

     編輯:MySQL 綜合教學

現象

PHP 專案出現 MySQL server has gone away,但 MySQL 服務器負載正常,客戶端直連無問題,netstat 顯示 TIME_WAIT 極少。

MySQL 超時參數檢查

SHOW VARIABLES LIKE '%out%';
-- 關鍵值:
connect_timeout = 10
interactive_timeout = 28800
wait_timeout = 28800
net_read_timeout = 30
net_write_timeout = 60

根因分析

  • PHP 使用長連線(mysql_pconnect 或連線池)
  • 連線閒置超過 wait_timeout(8小時)被 MySQL 主動斷開
  • PHP 端未檢測連線失效,嘗試復用導致錯誤
  • 客戶端直連屬短連線,用完即斷,不受影響

解決方案

  1. PHP 改用短連線:每請求建立、用完關閉(已驗證有效)
  2. 或啟用連線池驗證機制:validateConnection、testOnBorrow、testWhileIdle
  3. 調大 wait_timeout(治標不治本)
  4. MySQL 5.7+ 可用 MYSQL_OPT_RECONNECT 自動重連

最佳實踐

  • Web 應用預設使用短連線 + 連線池
  • 連線池配置 maxLifetime < wait_timeout
  • 執行關鍵操作前 ping 或輕量查詢驗證連線存活
  • 監控 Aborted_clients、Threads_connected 指標
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved