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 相关文章推荐
phpmyadmin config.inc.php配置示例
Aug 27 PHP
php解压文件代码实现php在线解压
Feb 13 PHP
ThinkPHP中的三大自动简介
Aug 22 PHP
php生成QRcode实例
Sep 22 PHP
浅谈PHP中output_buffering
Jul 13 PHP
PHP之正则表达式捕获组与非捕获组(详解)
Jul 29 PHP
通过PHP简单实例介绍文件上传
Dec 16 PHP
Symfony生成二维码的方法
Feb 04 PHP
Yii2.0 Basic代码中路由链接被转义的处理方法
Sep 21 PHP
php 判断过去离现在几年的函数(实例代码)
Nov 15 PHP
php 判断IP为有效IP地址的方法
Jan 28 PHP
解决thinkphp6(tp6)在状态码500下不报错,或者显示错误“Malformed UTF-8 characters”的问题
Apr 01 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中curl_multi的应用
2013/07/17 PHP
PHP7中I/O模型内核剖析详解
2019/04/14 PHP
vmware linux系统安装最新的php7图解
2019/04/14 PHP
jQuery DIV弹出效果实现代码
2009/07/03 Javascript
jQuery中的.bind()、.live()和.delegate()之间区别分析
2011/06/08 Javascript
js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME
2011/12/20 Javascript
javascript获取作用在元素上面的样式属性代码
2012/09/20 Javascript
Jquery ajax 同步阻塞引起的UI线程阻塞问题
2015/11/17 Javascript
使用vue.js开发时一些注意事项
2016/04/27 Javascript
AngularJS在IE8的不支持的解决方法
2016/05/13 Javascript
Bootstrap布局之栅格系统详解
2016/06/13 Javascript
Three.js学习之正交投影照相机
2016/08/01 Javascript
JS 动态判断PC和手机浏览器实现代码
2016/09/21 Javascript
js定时器实例分享
2016/12/20 Javascript
angular forEach方法遍历源码解读
2017/01/25 Javascript
详解用Webpack与Babel配置ES6开发环境
2019/03/12 Javascript
微信小程序云开发之使用云存储
2019/05/17 Javascript
js实现AI五子棋人机大战
2020/05/28 Javascript
python实现基本进制转换的方法
2015/07/11 Python
python基本语法练习实例
2017/09/19 Python
python验证码识别实例代码
2018/02/03 Python
python实现抽奖小程序
2020/04/15 Python
详解python常用命令行选项与环境变量
2020/02/20 Python
Python drop方法删除列之inplace参数实例
2020/06/27 Python
全球航班旅行搜索网站:Cheapflights
2017/05/19 全球购物
澳大利亚领先的亚麻品牌:Bed Threads
2019/12/16 全球购物
教育科学研究生自荐信
2013/10/09 职场文书
在求职信中如何凸显个人优势
2013/10/30 职场文书
图书馆标语
2014/06/19 职场文书
退休职工欢送会致辞
2015/08/01 职场文书
优秀团员主要事迹材料
2015/11/05 职场文书
高三语文教学反思
2016/02/16 职场文书
一波干货,会议主持词开场白范文
2019/05/06 职场文书
html实现随机点名器的示例代码
2021/04/02 Javascript
如何用Node.js编写内存效率高的应用程序
2021/04/30 Javascript
vue实现input输入模糊查询的三种方式
2022/08/14 Vue.js