0

我一直在尝试修改我的 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 错误文件只显示失败的第一次连接尝试。编辑:第一次失败是我测试中的设计,因为我希望它故障转移到第二台服务器。因此,我已经杀死了 serverA 上的 MySQL。

4

1 回答 1

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();
   }
于 2013-11-07T14:48:11.503 回答