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

PHP 慢速日誌導致 MySQL 連線中斷的問題分析與解決

     編輯:PHP 相關知識

前言

在專案開發中,開啟 PHP 的慢速日誌(request_slowlog_timeout = 10s)是我們的標準配置,它幫助我們發現並解決了許多效能瓶頸。然而,最近卻遇到一個極其詭異的問題:正是這個功能導致了 MySQL 連線異常中斷,迫使我們不得不暫時關閉它。

問題現象

後台執行一個長時間運行的腳本時,程式會拋出 2013 (Lost connection to MySQL server during query) 錯誤。具體情況如下:

  • 腳本中包含一個超過 300 次迴圈的循環,每次迴圈都會重複執行同一條 SQL 語句。
  • Nginx 存取日誌顯示,每次請求的執行時間約為 12 秒。
  • 嘗試在查詢前呼叫 mysql_ping() 進行連線檢測與重連,但問題依舊存在。

排查過程與意外發現

在百思不得其解之際,我們嘗試關閉 PHP 的慢速日誌功能。結果令人驚訝:問題立即消失,程式恢復正常運行。

原因推測與結論

雖然確切的底層機制尚待深入研究(可能涉及 PHP-FPM 在請求執行超時時發送信號中斷 MySQL 連線的處理邏輯),但實際驗證證實:當請求執行時間接近或超過 request_slowlog_timeout 閾值時,慢速日誌的記錄機制可能會干擾長時間運行的資料庫連線。

對於必須長時間運行的批次處理腳本,建議採取以下策略:

  1. 在腳本開頭使用 ini_set('request_slowlog_timeout', 0) 臨時關閉慢速日誌。
  2. 或將此類腳本改為 CLI 模式執行,避開 FPM 的超時限制。
  3. 優化 SQL 與迴圈邏輯,縮減單次請求執行時間。

若您遇到類似「Lost connection」且無法用常規重連解決的問題,不妨嘗試排查慢速日誌設定。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved