2011-07-19 74 views
1

我有一個用PHP編寫的Web應用程序的主 - 從設置。我有一個用於讀取的奴隸庫,以及一個用於寫入的主文件(如果已發送此請求,則讀取該文件)。我想爲讀取池中的已刪除崩潰的服務器添加一個自動化系統。目前我正在使用:查看MySQL服務器是否正常運行的最佳方法

foreach($readers as $reader) 
    { 

     $fp = @fsockopen($reader['host'],3306,$errno,$errstr,1); 
     if(!$fp) 
     { 
      //Remove from pool 
     } 
     unset($fp); 
    } 

我的主要問題是有一個更可靠的方法。我有很多誤報,反之亦然,因爲它實際上並沒有檢查MySQL服務器,而只是在端口3306上進行連接。有沒有辦法檢查MySQL服務器而不引發異常,這是PHP中的PDO和MySQLi擴展的行爲。

回答

7

您可以使用mysql_connect()並檢查false的結果,並在成功時立即關閉連接。如果你喜歡,你可以創建一個沒有權限的虛擬帳戶。

這真的是唯一可靠的方法,特別是如果你要區分任何其他隨機過程正在運行的MySQL服務器偵聽端口3306

+0

我得到的問題是,php正在拋出異常並退出500 Server Error的腳本。 – mrkmg

+0

沒關係,我沒有意識到@ symnbol在那裏工作。 – mrkmg

+0

這不是一個例外,只是一個錯誤消息。是的,您可以使用'@'或其他常規錯誤報告設置來控制這些設置。 –

0

你可以使用mysql_ping()來檢查當前DB連接你有開還活着

這裏是http://www.php.net/manual/en/function.mysql-ping.php

<?php 
set_time_limit(0); 

$conn = mysql_connect('localhost', 'mysqluser', 'mypass'); 
$db = mysql_select_db('mydb'); 

/* Assuming this query will take a long time */ 
$result = mysql_query($sql); 
if (!$result) { 
    echo 'Query #1 failed, exiting.'; 
    exit; 
} 

/* Make sure the connection is still alive, if not, try to reconnect */ 
if (!mysql_ping($conn)) { 
    echo 'Lost connection, exiting after query #1'; 
    exit; 
} 
mysql_free_result($result); 

/* So the connection is still alive, let's run another query */ 
$result2 = mysql_query($sql2); 
?> 
0

的最佳方式發佈到檢查是否有服務是活的是實際使用的例子。因此,對於MySQL嘗試連接並執行一些快速查詢,爲Web服務器嘗試獲取一些文件,爲PHP嘗試獲取一些簡單的腳本...

對於MySQL主/從設置,其中一個解決方案是實際檢查複製狀態。您可以檢查主站後面的從站有多少事務,並決定在有/舊數據時停止使用該從站。 (我不自己做複製,但我認爲你需要比較變量Read_Master_Log_PosRelay_Log_Pos

相關問題