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应用技巧
Mar 27 PHP
解析yahoo邮件用phpmailer发送的实例
Jun 24 PHP
PHP PDOStatement:bindParam插入数据错误问题分析
Nov 13 PHP
php url路由入门实例
Apr 23 PHP
PHP按行读取文件时删除换行符的3种方法
May 04 PHP
PHP实现数组递归转义的方法
Aug 28 PHP
PHP数组操作类实例
Jul 11 PHP
php读取torrent种子文件内容的方法(测试可用)
May 03 PHP
PHP获取二叉树镜像的方法
Jan 17 PHP
php微信分享到朋友圈、QQ、朋友、微博
Feb 18 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
May 14 PHP
PHP解决高并发的优化方案实例
Dec 10 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
vBulletin HACK----显示话题大小和打开新窗口于论坛索引页
2006/10/09 PHP
php学习之 认清变量的作用范围
2010/01/26 PHP
PHP获取数组中某元素的位置及array_keys函数应用
2013/01/29 PHP
实现PHP多线程异步请求的3种方法
2014/01/17 PHP
PHP模板解析类实例
2015/07/09 PHP
php删除数组指定元素实现代码
2017/05/03 PHP
javascript 多浏览器 事件大全
2010/03/23 Javascript
jQuery的链式调用浅析
2010/12/03 Javascript
Jqyery中同等与js中windows.onload的应用
2011/05/10 Javascript
js实现拖拽 闭包函数详细介绍
2012/11/25 Javascript
关于js中alert弹出窗口文本换行问题简单详细说明
2012/12/11 Javascript
js向上无缝滚动,网站公告效果 具体代码
2013/11/18 Javascript
jQuery ui 利用 datepicker插件实现开始日期(minDate)和结束日期(maxDate)
2014/05/22 Javascript
jQuery Ajax调用WCF服务详细教程
2015/03/31 Javascript
JavaScript中计算网页中某个元素的位置
2015/06/10 Javascript
CSS javascript 结合实现悬浮固定菜单效果
2015/08/23 Javascript
jquery中实现时间戳与日期相互转换
2016/04/12 Javascript
jQuery给div,Span, a ,button, radio 赋值与取值
2016/06/24 Javascript
Vue学习笔记进阶篇之函数化组件解析
2017/07/21 Javascript
MUI 实现侧滑菜单及其主体部分上下滑动的方法
2018/01/25 Javascript
Vue页面刷新记住页面状态的实现
2019/12/27 Javascript
js实现简单的打印表格
2020/01/15 Javascript
React实现类似淘宝tab居中切换效果的示例代码
2020/06/02 Javascript
Python内置的字符串处理函数详细整理(覆盖日常所用)
2014/08/19 Python
Python中字典映射类型的学习教程
2015/08/20 Python
Python查找文件中包含中文的行方法
2018/12/19 Python
Python进阶之全面解读高级特性之切片
2019/02/19 Python
简单了解python字符串前面加r,u的含义
2019/12/26 Python
手机配件第一品牌:ZAGG
2017/05/28 全球购物
Nixon手表英国官网:美国尼克松手表品牌
2020/02/10 全球购物
外科实习自我鉴定
2013/10/06 职场文书
战略合作意向书范本
2014/04/01 职场文书
作风建设演讲稿
2014/05/23 职场文书
关于教师节的广播稿
2014/09/10 职场文书
幼儿园教师考核评语
2014/12/31 职场文书
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
2021/05/21 Python