这是一个巧妙的小类,它将跨多个复制的 MySQL 服务器实例进行负载均衡,使用持久连接,并自动从池中删除失败的 MySQL 服务器。
你**只**应将此用于查询,切勿用于插入/更新/删除操作,除非你有一个多主服务器的情况,其中对任何数据库服务器的更新都会自动复制到其他服务器(我不知道 MySQL 是否支持这种情况)。
使用此类,你可以这样获取 MySQL 服务器的连接
`$con = MySQLConnectionFactory::create();`
以下是该类(你需要根据你的配置自定义 `$SERVERS` 数组——请注意,你可能对所有服务器使用相同的用户名、密码和数据库,只需更改主机名即可,但你并不强制使用相同的名称)
<?php
class MySQLConnectionFactory {
static $SERVERS = array(
array(
'host' => 'myHost1',
'username' => 'myUsername1',
'password' => 'myPassword1',
'database' => 'myDatabase1'),
array(
'host' => 'myHost2',
'username' => 'myUsername1',
'password' => 'myPassword2',
'database' => 'myDatabase2')
);
public static function create() {
$cons = array();
for ($i = 0, $n = count(MySQLConnectionFactory::$SERVERS); $i < $n; $i++) {
$server = MySQLConnectionFactory::$SERVERS[$i];
$con = mysql_pconnect($server['host'], $server['username'], $server['password']);
if (!($con === false)) {
if (mysql_select_db($server['database'], $con) === false) {
echo('Could not select database: ' . mysql_error());
continue;
}
$cons[] = $con;
}
}
if (count($cons) == 0) {
throw new Exception
('Unable to connect to any database servers - last error: ' . mysql_error());
}
$serverIdx = rand(0, count($cons)-1);
$con = $cons[$serverIdx];
return $con;
}
}
?>