如果遇到第一个失败或连接限制,我有一个关于与第二个主机连接的问题。
我的主机是法国的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。
答案 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