Laravel数据库读写分离配置的方法


Posted in PHP onOctober 13, 2019

配置范例

'mysql' => [
 'driver' => 'mysql', 
 'write' => [ 
 'host' => '192.168.1.180', 
 ], 
 'read' => [
 ['host' => '192.168.1.182'], 
 ['host' => '192.168.1.179'], 
 ],
 ... 
]

'mysql' => [
 'driver' => 'mysql', 
 'write' => [ 
 'host' => '192.168.1.180', 
 ], 
 'read' => [
 'host' => [
 '192.168.1.182',
 '192.168.1.179'
 ], 
 ],
 ... 
]

扩展配置范例

'mysql' => [
 'driver' => 'mysql', 
 'write' => [ 
 'host' => '192.168.1.180', 
 'username' => 'write',
 'password' => 'write',
 ], 
 'read' => [
 [
 'host' => '192.168.1.182',
 'username' => 'read1',
 'password' => 'read1',
 ], 
 [
 'host' => '192.168.1.179',
 'username' => 'read2',
 'password' => 'read2',
 ], 
 ],
 ... 
]

或者

'mysql' => [
 'driver' => 'mysql', 
 'write' => [ 
 'host' => '192.168.1.180', 
 'username' => 'write',
 'password' => 'write',
 ], 
 'read' => [
 'host' => [
 '192.168.1.179',
 '192.168.1.182',
 ],
 'username' => 'read',
 'password' => 'read', 
 ],
 ... 
]

公司数据库架构为一主多从,从库访问地址为唯一地址,该处方便负载均衡及扩展从库。所以最终线上采用的配置

'mysql' => [
 'driver' => 'mysql', 
 'write' => [ 
 'host' => '192.168.1.180', 
 'username' => 'write',
 'password' => 'write',
 ], 
 'read' => [
 'host' => '192.168.1.179'
 'username' => 'read',
 'password' => 'read', 
 ],
 ... 
]

代码分析

授人以鱼不如授人以渔,之所以配置如此灵活的原因,以及如何查找到这些配置方式。主要通过查找代码,分析代码;相关代码都在下面粘出,这里就不做解释了,代码能说明一切;

路径:vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php

代码:

class ConnectionFactory
{
 ...

 /**
 * Get the read configuration for a read / write connection.
 *
 * @param array $config
 * @return array
 */
 protected function getReadConfig(array $config)
 {
 $readConfig = $this->getReadWriteConfig($config, 'read');

 if (isset($readConfig['host']) && is_array($readConfig['host'])) {
 $readConfig['host'] = count($readConfig['host']) > 1
 ? $readConfig['host'][array_rand($readConfig['host'])]
 : $readConfig['host'][0];
 }

 return $this->mergeReadWriteConfig($config, $readConfig);
 }
 
 ...
 
 /**
 * Get a read / write level configuration.
 *
 * @param array $config
 * @param string $type
 * @return array
 */
 protected function getReadWriteConfig(array $config, $type)
 {
 if (isset($config[$type][0])) {
 return $config[$type][array_rand($config[$type])];
 }

 return $config[$type];
 }
 
 ...
 
 /**
 * Merge a configuration for a read / write connection.
 *
 * @param array $config
 * @param array $merge
 * @return array
 */
 protected function mergeReadWriteConfig(array $config, array $merge)
 {
 return Arr::except(array_merge($config, $merge), ['read', 'write']);
 }
 
 ...
}
 
 
class Arr
{
 ...
 
 /**
 * Get all of the given array except for a specified array of items.
 *
 * @param array $array
 * @param array|string $keys
 * @return array
 */
 public static function except($array, $keys)
 {
 static::forget($array, $keys);
 
 return $array;
 }
 
 ...
 
 /**
 * Remove one or many array items from a given array using "dot" notation.
 *
 * @param array $array
 * @param array|string $keys
 * @return void
 */
 public static function forget(&$array, $keys)
 {
 $original = &$array;
 
 $keys = (array) $keys;
 
 if (count($keys) === 0) {
 return;
 }
 
 foreach ($keys as $key) {
 $parts = explode('.', $key);
 
 while (count($parts) > 1) {
 $part = array_shift($parts);
 
 if (isset($array[$part]) && is_array($array[$part])) {
  $array = &$array[$part];
 } else {
  $parts = [];
 }
 }
 
 unset($array[array_shift($parts)]);
 
 // clean up after each pass
 $array = &$original;
 }
 }
 
 ...
}

以上这篇Laravel数据库读写分离配置的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
实现“上一页”和“下一页按钮
Oct 09 PHP
目录,文件操作详谈―PHP
Nov 25 PHP
PHP写入WRITE编码为UTF8的文件的实现代码
Jul 07 PHP
PHP学习笔记之二 php入门知识
Jan 12 PHP
解析php中call_user_func_array的作用
Jun 07 PHP
PHP跳转页面的几种实现方法详解
Jun 08 PHP
PHP循环结构实例讲解
Feb 10 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
Mar 18 PHP
php实现的双色球算法示例
Jun 20 PHP
PHP一个简单的无需刷新爬虫
Jan 05 PHP
Yii2框架视图(View)操作及Layout的使用方法分析
May 27 PHP
php实现自动生成验证码的实例讲解
Nov 17 PHP
Laravel第三方包报class not found的解决方法
Oct 13 #PHP
php7性能提升的原因详解
Oct 13 #PHP
php抽象方法和普通方法的区别点总结
Oct 13 #PHP
php use和include区别总结
Oct 13 #PHP
阿里对象存储OSS在laravel框架中的使用方法
Oct 13 #PHP
laravel框架 laravel-admin上传图片到oss的方法
Oct 13 #PHP
laravel实现一个上传图片的接口,并建立软链接,访问图片的方法
Oct 12 #PHP
You might like
PHP 5.0对象模型深度探索之绑定
2006/09/05 PHP
ThinkPHP实现将本地文件打包成zip下载
2014/06/26 PHP
php获取本周星期一具体日期的方法
2015/04/20 PHP
PHP实现PDO操作mysql存储过程示例
2019/02/13 PHP
Javascript合并表格中具有相同内容单元格示例
2013/08/11 Javascript
String.prototype实现的一些javascript函数介绍
2013/11/22 Javascript
JS常用表单验证方法总结
2014/05/22 Javascript
javascript面向对象之this关键词用法分析
2015/01/13 Javascript
百度搜索框智能提示案例jsonp
2016/11/28 Javascript
Vue实现双向绑定的方法
2016/12/22 Javascript
js实现一个简单的数字时钟效果
2017/03/29 Javascript
详解angular中的作用域及继承
2017/05/31 Javascript
bootstrap table方法之expandRow-collapseRow展开或关闭当前行数据
2020/08/09 Javascript
vue仿淘宝订单状态的tab切换效果
2020/06/23 Javascript
Vue框架里使用Swiper的方法示例
2018/09/20 Javascript
Nodejs中使用puppeteer控制浏览器中视频播放功能
2019/08/26 NodeJs
[04:31]2016国际邀请赛中国区预选赛妖精采访
2016/06/27 DOTA
[01:47]2018年度DOTA2最具人气解说-完美盛典
2018/12/16 DOTA
跟老齐学Python之有容乃大的list(1)
2014/09/14 Python
用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动
2015/11/05 Python
浅谈用VSCode写python的正确姿势
2017/12/16 Python
对python模块中多个类的用法详解
2019/01/10 Python
python实现五子棋人机对战游戏
2020/03/25 Python
python导包的几种方法(自定义包的生成以及导入详解)
2019/07/15 Python
物业管理求职自荐信
2013/09/25 职场文书
技术总监的工作职责
2013/11/13 职场文书
大学社团活动策划书
2014/01/26 职场文书
不拖欠农民工工资承诺书
2014/03/31 职场文书
学校安全工作汇报材料
2014/08/16 职场文书
教师批评与自我批评
2014/10/15 职场文书
幼儿园母亲节活动总结
2015/02/10 职场文书
2015年保险公司内勤工作总结
2015/05/23 职场文书
公司年会晚会开幕词
2019/04/02 职场文书
python OpenCV学习笔记
2021/03/31 Python
教你使用TensorFlow2识别验证码
2021/06/11 Python
未发现nvidia显卡怎么办?Win11系统中未检测到nvidia显卡解决教程
2022/04/08 数码科技