首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 導致 CPU 100% 真兇:PHP 長連線未關閉,補上 mysql_close 瞬間降溫

     編輯:MySQL 資料庫相關知識

線上 Linux AS4 + PHP5 + MySQL5 + Apache 2 伺服器,top 持續顯示 CPU 100%。排除 DDoS、系統層面後,發現 PHP 代碼大量使用 mysql_pconnect (持久連線) 卻從未呼叫 mysql_close()。補上關閉連線後,CPU 瞬間降至 1%~10% 正常區間。

問題根因

  • mysql_pconnect 重用連線池,但若腳本結束不釋放,連線累積耗盡 max_connections。
  • MySQL 內部為每個殭屍連線維護執行緒、緩衝區、鎖結構,CPU 飆升。
  • Apache Prefork 模式下,每個子進程持有獨立連線池,洩漏放大倍數。

修正清單

  1. 所有 PHP 腳本結束前呼叫 mysql_close($link)。
  2. 或改用短連線 mysql_connect,PHP 請求結束自動回收。
  3. 配置 php.ini:mysql.allow_persistent = Off 禁用持久連線。
  4. MySQL 端:wait_timeout=7200、interactive_timeout=7200 加速清理空閒連線。
  5. 啟用慢查詢日誌、SHOW PROCESSLIST 定期巡檢 Sleep 狀態連線數。

MySQL PHP 擴展核心函數速查 (記住要 close!)

教訓總結

「偷懶不寫 close()」是典型低級錯誤。任何語言、任何資料庫驅動,**資源獲取即初始化 (RAII)、用畢即歸** 是鐵律。配合連線池監控、超時回收、壓測驗證,杜絕連線洩漏導致的 CPU 暴衝。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
函數用途
mysql_connect建立短連線
mysql_pconnect建立持久連線 (慎用)
mysql_close關閉連線 (必呼叫)
mysql_query發送 SQL
mysql_fetch_array/assoc/row/object取得結果集行
mysql_free_result釋放結果集記憶體
mysql_select_db選擇資料庫
mysql_error/errno取得錯誤資訊
mysql_real_escape_string防注入轉義
mysql_insert_id取得自增 ID
mysql_affected_rows影響行數
mysql_ping檢測連線存活並重連
mysql_unbuffered_query不緩衝結果集 (大結果集)