如果First失败,我可以连接到第二个数据库主机吗?

时间:2017-12-09 15:35:05

标签: php sql pdo

如果遇到第一个失败或连接限制,我有一个关于与第二个主机连接的问题。

我的主机是法国的OVH共享主机(我无法修改apache/php/sql config),而MAX USER_CONNECTIONS (sql)是30。

我想切换主机是第一个达到限制并拒绝连接。

我可以使用吗?:

$dbhost = 'localhost';
$dbname = 'dbname';
$dbuser = 'dbuser';
$dbpswd = 'dbpass';
try{
    $db = new PDO('mysql:host='.$dbhost.';dbname='.$dbname,$dbuser,$dbpswd,array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
}catch(PDOexception $e){
    $dbhost2 = 'secondhost';
    $dbname2 = 'dbname';
    $dbuser2 = 'dbuser';
    $dbpswd2 = 'dbpass';
    try{
        $db = new PDO('mysql:host='.$dbhost2.';dbname='.$dbname2,$dbuser2,$dbpswd2,array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    }catch(PDOexception $e){
        die("DB Error please contact the web admin.");
    }
}

或者如果你有更好的选择..

NB :我没有太多的编程经验,我还没有使用OOP。

1 个答案:

答案 0 :(得分:1)

这个想法是对的,但是这个特定的实现是不灵活的,对于应该修复错误的网站管理员没有帮助。

想象一下为主服务器更改密码的情况。由于采用了无条件算法,您的代码将在100%的时间内开始连接到备份服务器,没有人会对此有所了解。

鉴于您想要克服特定错误("连接太多"),您应该在catch块中测试它是否是您期望的错误,并且至少记录错误消息。因此,网站广告最小化会发现问题并且会知道发生了什么。

$dboptions = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION) try{ $db = new PDO("mysql:host=$dbhost;dbname=$dbname;charset=utf8mb4",$dbuser,$dbpswd,$dboptions); }catch(PDOexception $e){ if ($e->getMessage() != "whatever particular error message you get") { error_log($e); } $dbhost2 = 'secondhost'; $dbname2 = 'dbname'; $dbuser2 = 'dbuser'; $dbpswd2 = 'dbpass'; $db = new PDO("mysql:host=$dbhost2;dbname=$dbname;charset=utf8mb4",$dbuser,$dbpswd,$dboptions); } 对网站管理员来说也没什么用处,因为他不知道备份服务器发生了什么。

因此,对于第二个,请不要正确捕获其异常,而是遵循您站点的常见错误处理例程。最简单的一个是全局尝试捕获整个代码,看起来相当直率,但至少比几十个本地尝试捕获每个都有自己的错误消息

所以它应该像

sudo ifconfig -a