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 相关文章推荐
配置支持SSI
Nov 25 PHP
PHP读取XML值的代码(推荐)
Jan 01 PHP
PHP高级编程实例:编写守护进程
Sep 02 PHP
php常用hash加密函数
Nov 22 PHP
php随机取mysql记录方法小结
Dec 27 PHP
PHP实现算式验证码和汉字验证码实例
Mar 09 PHP
php删除文本文件中重复行的方法
Apr 28 PHP
PHP中Enum(枚举)用法实例详解
Dec 07 PHP
深入浅析PHP的session反序列化漏洞问题
Jun 15 PHP
PHP对象的浅复制与深复制的实例详解
Oct 26 PHP
Ubuntu中支持PHP5与PHP7双版本的简单实现
Aug 19 PHP
php中对象引用和复制实例分析
Aug 14 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求数组全排列,元素所有组合的方法
2016/05/05 PHP
php类自动装载、链式操作、魔术方法实现代码
2017/07/23 PHP
PHP常用的类封装小结【4个工具类】
2019/06/28 PHP
JS 实现双色表格实现代码
2009/11/24 Javascript
JS实现自适应高度表单文本框的方法
2015/02/25 Javascript
JavaScript函数使用的基本教程
2015/06/04 Javascript
基于JavaScript实现定时跳转到指定页面
2016/01/01 Javascript
不用一句js代码初始化组件
2016/01/27 Javascript
jQuery中的100个技巧汇总
2016/12/15 Javascript
vue-router 源码实现前端路由的两种方式
2018/07/02 Javascript
更改BootStrap popover的默认样式及popover简单用法
2018/09/13 Javascript
微信小程序实现写入读取缓存详解
2019/08/30 Javascript
解决mui框架中switch开关通过js控制开或者关状态时小圆点不动的问题
2019/09/03 Javascript
vue-cli 为项目设置别名的方法
2019/10/15 Javascript
nodejs实现百度舆情接口应用示例
2020/02/07 NodeJs
JavaScript实现随机点名器
2020/03/25 Javascript
[41:54]2018DOTA2亚洲邀请赛 4.1 小组赛A组加赛 TNC vs Liquid
2018/04/03 DOTA
使用Python制作获取网站目录的图形化程序
2015/05/04 Python
python实现逆波兰计算表达式实例详解
2015/05/06 Python
python实现用户管理系统
2018/01/10 Python
np.dot()函数的用法详解
2020/01/17 Python
Tensorflow中批量读取数据的案列分析及TFRecord文件的打包与读取
2020/06/30 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
2020/07/05 Python
如何基于Python pygame实现动画跑马灯
2020/11/18 Python
HTML5中div、article、section的区别及使用介绍
2013/08/14 HTML / CSS
HTML5新特性之type=file文件上传功能
2018/02/02 HTML / CSS
英国最大的电子产品和家电零售企业:Currys PC World
2016/09/24 全球购物
英国山地公路自行车商店:Tweeks Cycles
2018/03/16 全球购物
Lacoste(法国鳄鱼)加拿大官网:以标志性的POLO衫而闻名
2019/05/15 全球购物
求职简历中个人的自我评价
2013/12/25 职场文书
经济管理专业自荐信
2013/12/30 职场文书
餐饮业创业计划书范文
2014/01/06 职场文书
标准离婚协议书(2014版)
2014/10/05 职场文书
幼儿园教师安全责任书
2015/05/08 职场文书
珍爱生命主题班会
2015/08/13 职场文书
微信小程序APP页面的之间的相互传递参数以及自定义组件
2022/04/19 Javascript