如果第一个故障或连接限制达到,我有一个关于连接到第二个主机的问题。
我的主机在法国的共享主机上是 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.");
}
}
或者如果你有更好的选择..
注意:我没有太多的编程经验,我还没有使用 OOP。
这个想法是对的,但这个特定的实现是不灵活的,对应该修复错误的站点管理员没有帮助。
想象一下主服务器的密码已更改的情况。由于无条件算法,您的代码将开始 100% 的时间连接到备份服务器,并且没有人对此有任何想法。
鉴于您想克服特定错误(“连接过多”),在您的 catch 块中,您应该测试它是否是您期望的错误,否则至少记录错误消息。所以站点管理员会注意到一个问题,并且会知道发生了什么。
die("DB Error please contact the web admin.");
对于站点管理员来说也没有多大用处,因为他不知道备份服务器发生了什么。
因此,对于第二个,不要立即捕获其异常,而是遵循站点的常见错误处理例程。最简单的方法是对整个代码进行全局 try catch,这看起来相当生硬,但至少比几十个本地 try 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);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句