PHP的故障转移数据库连接

时间:2013-11-07 14:20:31

标签: php mysql

我一直在尝试修改我的PHP数据库连接,以包含到另一台服务器的故障转移连接。我知道这个问题已被提出,但我似乎无法让它发挥作用。这是我到目前为止的代码。

我知道备份服务器和prod服务器都工作,因为我从为$ serverA配置的两台服务器中获得了所需的结果。这是故障转移组件无效。

<?php

    $serverA = "mysiteA.dyndns.org:3306";
    $serverB = "mysiteB.no-ip.biz:3306";
    $user="myuser";
    $password="mypass";  
    $database = "mydb";

    $connection = mysql_connect($serverA,$user,$password);

    if (!($connection)) {
    $connection = mysql_connect($serverB,$user,$password); 
    };

    $db = mysql_select_db($database,$connection);  

    $query = "SELECT listener_snapshot FROM listener_incr";
    $result = mysql_query($query);        

    $i = -60;

    while($row = mysql_fetch_assoc($result))
    {
        $dataset1[] = array($i,$row['listener_snapshot']);
        $i++;
    }
    $final = json_encode($dataset1,JSON_NUMERIC_CHECK);
    echo $final;
?> 

PHP错误文件除了首次尝试连接失败外没有显示任何内容。编辑:第一次失败是我的测试中的设计,因为我希望它故障转移到第二台服务器。因此我在服务器A上杀了MySQL。

1 个答案:

答案 0 :(得分:4)

  

以后请停止使用mysql_*个功能。你最好开始玩PDO。

您可以简单地创建一个包含所有可能服务器的数组,然后迭代它以期望成功。

$serverA = "mysiteA.dyndns.org:3306"; 
$serverB = "mysiteb.no-ip.biz:3306"; 
$user="myuser"; 
$password="mypass"; 
$database = "mydatabase"; 

$servers = array(
  'A' => array(
    'username' => $user, 
    'password' => $password, 
    'host'     => $serverA
    ), 

   'B' => array(
    'username' => $user,
    'password' => $password,
    'host'     => $serverB 
));


function mysql_f_connect(array $servers) {
   foreach ($servers as $name => $array){
     $connection = @mysql_connect($array['host'], $array['username'], $array['password']);  
     // You can also store name of the server somewhere else
     if ($connection !== false) {
          return $connection;
     }
   }

   return false;
}

如果与所有服务器的连接失败,此函数将返回FALSE。否则,它会返回一个可用于其余部分的资源,如mysql_select_db()

   $connection = mysql_f_connect($servers);

   if ($connection !== false) {
      // Well, you can start doing anything else
      $db = mysql_select_db($database,$connection);
   } else {
      // For debugging purposes:
      echo mysql_error();
   }