PHP Thinkphp框架实现MySQL数据库读写分离
本文主要介绍了PHP Thinkphp框架实现MySQL数据库读写分离代码解析,欢迎大家的学习。
使用原生的sql语句进行写入操作的时候,要用execute函数,读操作要用query函数。
ThinkPHP提供了完善的读写分离功能,不需要手动切换数据库。什么时候读,什么时候写系统会自动判断。
读数据时系统会读从服务器,而写数据时系统会写主服务器。最终由数据库实现同步机制,这就是典型的数据库读写分离实现。
MySQL数据主从同步还是要靠MySQL的机制来实现,主要是MySQL主从同步的延迟问题的优化,延迟时间太长不仅影响业务,还影响用户体验。
ThinkPHP读写分离配置代码
打开项目下的数据库配置文件,修改其中的数据库连接参数。要实现多数据库连接,只需要使用","分隔多台服务器,如下:
return array(
//'配置项'=>'配置值'
'URL_CASE INSENSITIVE' => true,
"DB_DEPLOY_TYPE" => 1, //是否启用分布式
'DB_RW_SEPARATE' => true, //是否启用智能读写分离
'DB_TYPE' => 'mysql', //数据库类型
'DB_HOST' => '192.168.1.1,192.168.1.2', //服务器地址
'DB_NAME' => 'user', //数据库名
'DB_USER' => 'root,root', //用户名
'DB_PWD' => 'aa,12', //密码
'DB_PREFIX' => 'tp_', //数据库表前缀
"project_name" => "php",
'TMPL_L_DELIM' => '<!--{',
'TMPL_R_DELIM' => '}-->',
'LAYOUT_ON' => true,
);
ThinkPHP读写分离机制
thinkphp核心类Thinkphp/library/Model.class.php 中的query 方法,
调用Thinkphp/library/Think/Db/Driver/Mysql.class.php中的query 方法
上面的query方法中的初始化数据库链接时,initConnect(false),调用Thinkphp/library/Think/Db/Db.class.php中的方法,
注意false、true代码实现。true表示直接调用主库,false表示调用读写分离的读库。
multiConnect函数
/**
* 连接分布式服务器
* @access protected
* @param boolean $master 主服务器
* @return void
*/
protected function multiConnect($master = false)
{
foreach ($this->config as $key => $val) {
$_config[$key] = explode(',', $val);
}
// 数据库读写是否分离
if (C('DB_RW_SEPARATE')) {
// 主从式采用读写分离
if ($master)
// 主服务器写入
$r = floor(mt_rand(0, C('DB_MASTER_NUM') - 1));
else {
if (is_numeric(C('DB_SLAVE_NO'))) {// 指定服务器读
$r = C('DB_SLAVE_NO');
} else {
// 读操作连接从服务器
$r = floor(mt_rand(C('DB_MASTER_NUM'), count($_config['hostname']) - 1)); // 每次随机连接的数据库
}
}
} else {
// 读写操作不区分服务器
$r = floor(mt_rand(0, count($_config['hostname']) - 1)); // 每次随机连接的数据库
}
$db_config = array(
'username' => isset($_config['username'][$r]) ? $_config['username'][$r] : $_config['username'][0],
'password' => isset($_config['password'][$r]) ? $_config['password'][$r] : $_config['password'][0],
'hostname' => isset($_config['hostname'][$r]) ? $_config['hostname'][$r] : $_config['hostname'][0],
'hostport' => isset($_config['hostport'][$r]) ? $_config['hostport'][$r] : $_config['hostport'][0],
'database' => isset($_config['database'][$r]) ? $_config['database'][$r] : $_config['database'][0],
'dsn' => isset($_config['dsn'][$r]) ? $_config['dsn'][$r] : $_config['dsn'][0],
'params' => isset($_config['params'][$r]) ? $_config['params'][$r] : $_config['params'][0],
'charset' => isset($_config['charset'][$r]) ? $_config['charset'][$r] : $_config['charset'][0],
);
return $this->connect($db_config, $r);
}
以上就是本文PHP Thinkphp框架实现MySQL数据库读写分离的全部内容,希望对大家的学习有所帮助。
相关推荐
深度学习 -- 损失函数
深度残差网络(Deep Residual Networks (ResNets))
深度学习 -- 激活函数
神经网络训练 -- 调整学习速率
生成对抗网络(GAN)改进与发展
生成对抗网络(GAN)优点与缺点
生成对抗网络(GAN)的训练
生成对抗网络(GAN)基本原理
生成模型与判别模型