简单几行PHP代码 搞定Slave数据库的连接平均分布

对于访问量较大的动态网站来说,后端MySQL数据库通常会采用主从(Master / Slave)同步的架构设计。

如果资金宽裕,可以购买昂贵的f5负载均衡器来解决多台Slave数据服务器的访问。还可通过免费的开源软件LVS来实现多台后端Slave数据服务器的访问,但LVS的设置比较繁琐,需要具备一些网络技术方面的知识储备,门槛还是较高的。

那么,是否还有更简单的方法呢?下面我来分享一段PHP代码,简单几行,就可以搞定多台后端Slave数据库的连接平均分布。

<?php
//定义多个数据库服务器信息
$slaveDbList = array(
    '1' => array('DB_HOST'=>'192.168.1.1', 'DB_USER'=>'slaveuser', 'DB_PW'=>'123456'),
    '2' => array('DB_HOST'=>'192.168.1.2', 'DB_USER'=>'slaveuser', 'DB_PW'=>'123456')
);

//定义hash矩阵
$slaveHashList = array(
    '0'=>'1', '1'=>'1', '2'=>'1', '3'=>'1', '4'=>'1', '5'=>'1', '6'=>'1', '7'=>'1',
    '8'=>'2', '9'=>'2', 'a'=>'2', 'b'=>'2', 'c'=>'2', 'd'=>'2', 'e'=>'2', 'f'=>'2'
);

//获取客户端ip,并计算hash代码
$clientIp = getClientIp();
$ipHash = substr(md5($clientIp), 0, 1);

//声明数据库连接信息
define('SLAVE_DB_HOST',         $slaveDbList[$slaveHashList[$ipHash]]['DB_HOST']); //数据库服务器地址
define('SLAVE_DB_USER',         $slaveDbList[$slaveHashList[$ipHash]]['DB_USER']); //用户名
define('SLAVE_DB_PW',           $slaveDbList[$slaveHashList[$ipHash]]['DB_PW']);   //密码
define('SLAVE_DB_NAME',         'test'); //数据库名称
define('SLAVE_DB_CHARSET',      'utf8'); //编码格式

function getClientIp()
{
    $clientIp = null;
 
    if ($clientIp !== null) return $clientIp;
    if (isset($_SERVER)) {
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
            foreach ($arr as $ip) {
                $ip = trim($ip);
                if ($ip != 'unknown') {
                    $clientIp = $ip;
                    break;
                }
            }
        } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
            $clientIp = $_SERVER['HTTP_CLIENT_IP'];
        } else {
            if (isset($_SERVER['REMOTE_ADDR'])) {
                $clientIp = $_SERVER['REMOTE_ADDR'];
            } else {
                $clientIp = '0.0.0.0';
            }
        }
    } else {
        if (getenv('HTTP_X_FORWARDED_FOR')) {
            $clientIp = getenv('HTTP_X_FORWARDED_FOR');
        } elseif (getenv('HTTP_CLIENT_IP')) {
            $clientIp = getenv('HTTP_CLIENT_IP');
        } else {
            $clientIp = getenv('REMOTE_ADDR');
        }
    }
    preg_match("/[\d\.]{7,15}/", $clientIp, $onlineIp);
    $clientIp = !empty($onlineIp[0]) ? $onlineIp[0] : '0.0.0.0';
    return $clientIp;
}
?>

阳光部落原创,更多内容请访问http://www.sunbloger.com/

相关内容:

发表评论