2009-06-11 61 views
0

和數據庫MYSQL如何在PHP中啓用數據庫自​​動重新連接?

+0

你能成爲一個更具體一點?你用什麼來連接數據庫,mysql擴展,mysqli或抽象層?你得到什麼樣的錯誤信息等? – ruquay 2009-06-11 17:25:09

+0

我正在使用mysql擴展。 – omg 2009-06-11 17:29:20

+0

@ruquay,其實這個問題很具體。如果您使用mysqli或較早的mysqli,則無關緊要。顯示你不明白[auto-reconnect](http://dev.mysql.com/doc/refman/5.0/en/auto-reconnect.html)是什麼意思。這個問題與http://stackoverflow.com/revisions/1003841/1 – Pacerier 2014-12-17 09:16:39

回答

0

你可以寫,這將通過連接和情況下來ping該數據庫的功能,再重新連接,然後進行任何你想要的查詢,或者也採取mysqli PHP庫看看,它可能對你有用。

PS。爲了維護數據庫連接,實現Singleton design pattern也是很有用的,一旦創建它將連接到數據庫,然後你可以實現getConnection方法,每次都會進行上面描述的檢查。

PPS。你可以使用一個異常,嘗試你的查詢,每當它失敗時捕獲一個異常,重新連接並重試。

2

您可以使用mysql_ping()函數來測試連接的狀態,並在返回false時重新連接。如果您在該文檔頁面上提到的5.0.13之前使用MySQL,mysql_ping()甚至會重新連接; 「自MySQL 5.0.13以來,自動重新連接功能被禁用。」

0

你應該檢查查詢是否失敗。通過檢查錯誤代碼,您可以判斷是否由於沒有連接而重新連接失敗。只要確保你跟蹤重新連接嘗試,所以你不會陷入循環。

-1

爲什麼您需要首先「重新連接」?你如何/爲什麼斷開連接?在PHP中,您可以在腳本的開頭連接,並在腳本結尾處自動關閉連接。

根本不需要在腳本中調用mysql_close(如果您明確關閉了連接,那麼「自動重新連接」會很愚蠢)。您可以嘗試mysql_pconnect這就是您要找的。連接將永久保持打開狀態,其他連接的腳本可以使用連接。

7

有時,當您的MySQL連接打開時間過長時,如果沒有查詢的時間超過my.cnf中的wait_timeout值,則連接到數據庫的連接將被丟棄。你會得到「MySQL服務器已經消失」的超時錯誤。

這是我如何實現在我的代碼自動重新連接:

class databaseClass { 
    var $conn; 
    var $db; 

    public function __construct() { 
     $this->connect(); 
    } 

    public function connect() { 
     $this->conn = mysql_connect(DB_HOST, DB_USER, DB_PASS); 
     $this->db = mysql_select_db(DB_NAME, $this->conn); 
    } 

    public function disconnect() { 
     mysql_close($this->conn); 
    } 

    public function reconnect() { 
     $this->disconnect(); 
     $this->connect(); 
    } 

    public function queryCompanyExist($company) { 
     //auto reconnect if MySQL server has gone away 
     if (!mysql_ping($this->conn)) $this->reconnect(); 

     $query = "SELECT name FROM company WHERE name='$company'"; 
     $result = mysql_query($query); 
     if (!$result) print mysql_error() . "\r\n"; 
     return mysql_fetch_assoc($result); 
    } 
} 

這裏指的更多資料有關

5

從C MySQL的API:

my_bool重新連接= 0; mysql_options(& mysql,MYSQL_OPT_RECONNECT,& reconnect); 見http://dev.mysql.com/doc/refman/5.6/en/auto-reconnect.html

從在php.ini PHP的mysqli設置全局: mysqli.reconnect =在 見http://www.php.net/manual/en/mysqli.configuration.php#ini.mysqli.reconnect

對於PHP PDO MySQL驅動程序應該是可以通過PDO ::的setAttribute但我無法找到表明它已經實施的文件。該代碼似乎試圖尊重MYSQL_OPT_RECONNECT,這是現在需要的MySQL,但在初始實現(https://bugs.php.net/bug.php?id=58863)中未能這樣做。58863中修補程序的意圖是允許: 新的PDO('mysql:host = xxx','xx','xx',array(PDO :: MYSQL_OPT_RECONNECT => true));

爲什麼重新連接發生的原因有多種,但通常是因爲池組連接包含已超時由於缺乏使用的成熟的連接。默認情況下,mysql連接在8小時後超時。請參閱:http://dev.mysql.com/doc/refman/5.6/en/gone-away.html

對於重連見的副作用:http://dev.mysql.com/doc/refman/5.6/en/auto-reconnect.html

相關問題