天天看點

MySQL server has gone away 問題分析

最近網站時不時報錯:MySQL server has gone away

問題分析,mysql在建立連接配接之後,之後處理邏輯時間過長導緻mysql連接配接逾時,假設一個請求發起,如下執行順序:

mysql_connect-->ok(wait_timeout = 30s)-->(insert,select,update,delete)->ok->邏輯處理(邏輯處理時間:40s,其中,無任何的insert,select,update,delete)->(insert,select,update,delete)-->catch:MySQL server has gone away;

因邏輯執行過程,(比如一些統計資訊,或者一些大資料的處理資訊),不能完全保證在wait_timeout設定的時間範圍内執行,那麼,隻能檢測連接配接狀态,若連接配接狀态已經斷開,那麼,再次進行連接配接,處理流程如下:

mysql_connect-->ok(wait_timeout = 30s)-->(insert,select,update,delete)->ok->邏輯處理(邏輯處理時間:40s,其中,無任何的insert,select,update,delete)->檢測連接配接狀态,若連接配接逾時,關閉上一個連接配接句柄(mysql_close()),重新開啟連接配接(mysql_connect->ok)->(insert,select,update,delete)-->catch:MySQL server has gone away;

PHP代碼大概如下:

$connect = mysql_connect( '127.0.0.1', 'root', '123456',131072);

mysql_select_db('dbname');

//@todo 程式邏輯
for ($i=0;$i<100000000;$i++){
    //@todo
}

//檢查伺服器是否關閉了連接配接
if (!mysql_ping($connect)) {
    //關閉上一個連接配接
    mysql_close($connect);
    
    //重新進行連接配接
    $connect = mysql_connect('127.0.0.1', 'root', '123456', 131072);
    
    //這句很重要
    mysql_select_db('dbname');
}  

$result = mysql_query("SELECT * from member",$connect); //查詢

while($row = mysql_fetch_array($result))
{
    var_dump($row);
}