MySQL Server has gone away本質是連接被服務端主動斷開,最常見兩大場景:
編輯my.cnf/my.ini:
[mysqld]
wait_timeout = 2880000 # 33天,實質永不超時
interactive_timeout = 2880000
max_allowed_packet = 100M # 按業務最大包調整,建議≥10M
或運行時動態設置(需SUPER權限):
SET GLOBAL wait_timeout=2880000;
SET GLOBAL max_allowed_packet=100*1024*1024;
PHP中封裝ping()方法,執行長任務前調用:
function ping() {
if (!mysql_ping($this->link)) {
mysql_close($this->link); // 關鍵:必須先關閉舊連接
$this->connect(...); // 重新建立連接
}
}
// 業務調用示例
for ($i=0; $i<10; $i++) {
$str = file_get_contents('https://slow-site.com'); // 耗時操作
}
$db->ping(); // 檢查並重連
$db->query('SELECT * FROM table'); // 安全執行
核心細節:mysql_ping檢測斷開後,必須先mysql_close再重連,否則PHP 5.x+下新連接句柄可能不可用(舊環境mysql_connect直接覆蓋即可)。
MYSQL_OPT_READ/WRITE_TIMEOUT)reconnect=0(默認關閉)--skip-networking或防火牆封鎖3306wait_timeout設大、max_allowed_packet設夠ping()主動重連,mysql_close後mysql_connect雙管齊下,徹底告別gone away。