2009-09-23 95 views
11

我在使用PHP中的mysqli類時遇到了麻煩,而且我無法在任何地方找到答案。PHP mysqli重新連接問題

在我的腳本中,一個類創建一個mysqli連接,它在整個函數中使用它。之後,這個腳本分叉了。這個連接也是由孩子們使用的,但是當孩子死亡時,我遇到了父母關閉連接的問題(MYSQL Server Has Away)。

在我切換到mysqli(剛剛使用mysql)之前,我只是簡單地調用了mysql_ping,以確保在父進程中執行查詢之前數據庫連接已經存在。 Mysqli有一個類似的ping功能,但它實際上並沒有重新連接,如果連接不見了。我嘗試使用mysqli.reconnect = ON全局設置,但沒有運氣(使用php.ini和ini_set)。

php mysql_connect函數允許你獲取一個已經存在的連接,所以如果我使用的是mysql而不是mysqli,那麼我可以簡單地在子進程分叉後重新使用子連接。但mysqli似乎沒有任何這樣的功能...

我能做的唯一的事情就是調用mysqli-> ping(),如果返回false,則重新連接到父級數據庫。這是非常低效率,我寧願弄清楚如何正確使用mysqli(並且不需要手動重新連接)必須更改回mysql ..

有什麼建議嗎?

回答

13

mysqli_ping()的醫生說,如果你設置的全局選項mysqli.reconnect爲1(在php.ini)當它檢測到連接已經消失,那麼mysqli_ping()將重新連接。

+3

工作。我沒有意識到你不能使用ini_set來修改這個變量,並且作爲我的天才,我之前在php.ini中添加了這一行,不知道已經有一個mysli.reconnect = Offline文件。但刪除那個,只使用mysqli.reconnect工作,並使mysqli-> ping()執行就像mysql_ping。謝謝您的幫助! – 2009-09-24 16:43:36

0

ü可以嘗試一些有點不同..不是..坪嘗試發送一個非常簡單的低強度的查詢像現在「選擇( )「,看看你是否有更好的結果。

+0

可能有幫助的原因... mysql將你看作是一個活躍用戶,而不是僅僅持有連接並佔用資源的人..我相信my.ini/my.cnf中有一些超時設置會影響該行爲..如果你有機會獲得,你也可以看看它。 – 2009-09-24 01:54:31

0

難道你不能使用持久連接嗎?另外,fork()真的有必要嗎?

-2

我想你需要在my.cng中設置mysqli.reconnect,這是mysql的配置,而不是php.ini,我無法通過ini_set設置更改重新連接,但是我的系統管理員在我的系統管理員中完成了它。 CNF。

所以,點點困惑,其他人已經php.ini文件中做了....

+0

不正確。 'my.cnf'只涉及MySQL服務器,所以通常對PHP客戶端沒有影響,'mysqli'只存在於PHP中。[mysqli.reconnect](http://www.php.net/manual/) en/mysqli.configuration.php#ini.mysqli.reconnect)*是一個PHP配置設置。 – Synchro 2014-05-06 12:22:02

1
function IsConnected() { 
    if (empty($this->_connectionID) === FALSE && mysqli_ping($this->_connectionID) === TRUE) { 
     return true; // still have connect 
    } 
    $this->_connectionID = false; 
    return false; // lose connection 
}