2012-08-31 53 views
0

我有一個很好的函數叫做lnk(),我已經用了很長時間連接到MySQL。 最近,我決定添加mysqli_ping調用來檢查連接,並在需要時重新連接,因爲我經歷了一個守護進程(24/7全天候運行)的問題,該守護進程在長時間不活動之後不斷失去與MySQL的連接。mysqli_ping break mysqli_multi_query

實施後,我開始有多個查詢問題。 如果在mysqli_multi_query之後發送ping,那麼在發送ping命令時,連接到MySQL將丟失,除非在ping之前發現mysqli_store_result。

$mq = mysqli_multi_query(lnk(), "SHOW PROCESSLIST;"); 
mysqli_next_result(lnk()); 
$result = mysqli_store_result(lnk()); 
while($row = mysqli_fetch_row($result)) { 
    print_r($row); 
} 

任何想法爲什麼會發生這種情況?

請不要在這些情況下向庫中添加一個變量來忽略連接檢查。我已經想到了,這還不夠好。我需要確切地知道爲什麼會發生這種情況,以及ping在這種情況下對我的連接做了什麼。

+0

您可能需要在各種調用中重複使用相同的'$ link'。如果連接在'mysqli_multi_query'和其他連接之間重置,'lnk()'會給你一個新的連接......這反過來打破了'mysqli_next_result'。 – EthanB

+0

休息發生在ping不在next_result。 – transilvlad

+0

無論如何,我認爲你應該可以在不同的功能中重複使用相同的鏈接值。 – EthanB

回答

1

在幕後:

...這似乎刪除你的結果。

這意味着您應該只重新連接一次(在致電multi_query之前)。例如:

$link = lnk(); //once 
$mq = mysqli_multi_query($link, "SHOW PROCESSLIST;"); 
mysqli_next_result($link); 
$result = mysqli_store_result($link); 
while($row = mysqli_fetch_row($result)) { 
    print_r($row); 
} 
+0

您是否閱讀過斜體文字?我有一個參數傳遞給連接驗證,它工作得很好。只有在其他不是多重查詢的情況下才會調用ping。我的問題不是我不知道如何使代碼工作。我的問題是爲什麼ping在多查詢的情況下做到這一點? ping是否真的是ping的其他東西?就像一個特定的命令? – transilvlad

+0

對不起,我認爲「參數」,它默認爲「做平」。 (但是,明確重用相同的鏈接並不會造成傷害)。文檔說''ping'可能會自動爲你重新連接 - 雖然我不認爲這是在這裏發生的,因爲你的多重查詢是成功的(對吧?)。 IIRC,您不能在PDO中同時打開多個語句。有可能'ping'在封面下面做一個'SELECT 1',這可能會導致多重查詢爆炸。 – EthanB

+0

我認爲是一樣的,但是有人知道嗎?或者在不發送命令的情況下檢查連接的另一種方法?我不使用ping來重新連接,而是在無限控制的循環中檢查連接,該循環每隔一定間隔執行一些操作。 – transilvlad