©
本文档使用
php.cn手册 发布
默认情况下,插件并不会在连接一个服务器失败的时候进行故障处理。这是为了防止 连接状态中的陷阱。 这里建议手动的对连接错误进行处理,你可以捕获这个错误,重新建立连接,执行的你的查询,如同下面展示的那样。
如果连接状态并不是由于你的操作引起的,你可以选择自动进行错误处理或者无视他。 通过配置可以实现,当 master 出现故障,可以在重新连接 master 之前,自动尝试连接 一台 slave 去自动处理故障,或者无视这个错误。因为 自动故障转移 并不是一个十分安全的方式,这里就不做过多讨论了,在 concepts section 中会有更多的说明。
Example #1 手动故障转移,可选自动
{ "myapp": { "master": { "master_0": { "host": "localhost", "socket": "\/tmp\/mysql.sock" } }, "slave": { "slave_0": { "host": "simulate_slave_failure", "port": "0" }, "slave_1": { "host": "127.0.0.1", "port": 3311 } }, "filters": { "roundrobin": [] } } }
Example #2 手动故障转移
<?php
$mysqli = new mysqli ( "myapp" , "username" , "password" , "database" );
if (! $mysqli )
die( sprintf ( "[%d] %s\n" , mysqli_connect_errno (), mysqli_connect_error ()));
$sql = "SELECT 1 FROM DUAL" ;
if (!( $res = $link -> query ( $sql ))) {
switch ( $link -> errno ) {
case 2002 :
case 2003 :
case 2005 :
printf ( "Connection error - trying next slave!\n" );
$res = $link -> query ( $sql );
break;
default:
die( sprintf ( "SQL error: [%d] %s" , $link -> errno , $link -> error ));
break;
}
}
if ( $res ) {
var_dump ( $res -> fetch_assoc ());
}
?>