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 相关文章推荐
php 之 没有mysql支持时的替代方案
Oct 09 PHP
PHP编程最快明白(第一讲 软件环境和准备工作)
Oct 25 PHP
php join函数应用
May 04 PHP
PHP中用hash实现的数组
Jul 17 PHP
PHP Session 变量的使用方法详解与实例代码
Sep 11 PHP
一个严格的PHP Session会话超时时间设置方法
Jun 10 PHP
PHP数组排序之sort、asort与ksort用法实例
Sep 08 PHP
php延迟静态绑定实例分析
Feb 08 PHP
PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
Jan 04 PHP
PHP数字金额转换成中文大写显示
Jan 05 PHP
实例讲解PHP表单处理
Feb 15 PHP
PHP htmlspecialchars()函数用法与实例讲解
Mar 08 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源码分析之DZX1.5字符串截断函数cutstr用法
2015/06/17 PHP
thinkPHP引入类的方法详解
2016/12/08 PHP
js parentElement和offsetParent之间的区别
2010/03/23 Javascript
JavaScript中的this到底是什么(一)
2015/12/09 Javascript
JS+Canvas 实现下雨下雪效果
2016/05/18 Javascript
jQuery使用Layer弹出层插件闪退问题
2016/12/22 Javascript
原生JS实现《别踩白块》游戏(兼容IE)
2017/02/20 Javascript
微信小程序 支付功能(前端)的实现
2017/05/24 Javascript
解决BootStrap Fileinput手机图片上传显示旋转问题
2017/06/01 Javascript
Vue使用vue-cli创建项目
2017/09/01 Javascript
通过js控制时间,一秒一秒自己动的实例
2017/10/25 Javascript
npm配置国内镜像资源+淘宝镜像的方法
2018/09/07 Javascript
详解在不使用ssr的情况下解决Vue单页面SEO问题
2018/11/08 Javascript
js/jQuery实现全选效果
2019/06/17 jQuery
解决vue的过渡动画无法正常实现问题
2019/10/31 Javascript
基于vue实现图片验证码倒计时60s功能
2019/12/10 Javascript
使用vue cli4.x搭建vue项目的过程详解
2020/05/08 Javascript
vue实现购物车加减
2020/05/30 Javascript
JS事件循环机制event loop宏任务微任务原理解析
2020/08/04 Javascript
解析Python中的变量、引用、拷贝和作用域的问题
2015/04/07 Python
使用Python的PIL模块来进行图片对比
2016/02/18 Python
Python 中Pickle库的使用详解
2018/02/24 Python
python创建文件备份的脚本
2018/09/11 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
2019/11/08 Python
如何使用python传入不确定个数参数
2020/02/18 Python
keras的ImageDataGenerator和flow()的用法说明
2020/07/03 Python
Python基于xlutils修改表格内容过程解析
2020/07/28 Python
HTML5新增的表单元素和属性实例解析
2014/07/07 HTML / CSS
味多美官网:蛋糕订购,100%使用天然奶油
2017/11/10 全球购物
JSF面试题:Jsf中的核心类用那些?有什么作用?LiftCycle六大生命周期是什么?
2014/07/17 面试题
社区工作者感言
2014/03/02 职场文书
店面销售职位的职责
2014/03/09 职场文书
员工考核评语大全
2014/04/26 职场文书
迟到检讨书范文
2015/01/27 职场文书
用Python进行栅格数据的分区统计和批量提取
2021/05/27 Python
MySQL完整性约束的定义与实例教程
2021/05/30 MySQL