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 相关文章推荐
967 个函式
Oct 09 PHP
PHP 文件上传源码分析(RFC1867)
Oct 30 PHP
php header示例代码(推荐)
Sep 08 PHP
PHPMailer的主要功能特点和简单使用说明
Feb 17 PHP
PHP日志LOG类定义与用法示例
Sep 06 PHP
thinkphp5引入公共部分header、footer的方法详解
Sep 14 PHP
php反射学习之不用new方法实例化类操作示例
Jun 14 PHP
PHP Redis扩展无法加载的问题解决方法
Aug 22 PHP
PHP调用QQ互联接口实现QQ登录网站功能示例
Oct 24 PHP
PHP设计模式之 策略模式Strategy详解【对象行为型】
May 01 PHP
基于PHP实现短信验证码发送次数限制
Jul 11 PHP
PHP生成图表pChart的示例解析
Jul 31 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
PHP3 safe_mode 失效漏洞
2006/10/09 PHP
一些被忽视的PHP函数(简单整理)
2010/04/30 PHP
jQuery EasyUI API 中文文档 - DateBox日期框
2011/10/15 PHP
PHP写的求多项式导数的函数代码
2012/07/04 PHP
PHP从二维数组得到N层分类树的实现代码
2016/10/11 PHP
Thinkphp5+uploadify实现的文件上传功能示例
2018/05/26 PHP
用document.documentElement取代document.body的原因分析
2009/11/12 Javascript
jQuery 方法大全方便学习参考
2010/02/25 Javascript
jQuery AjaxQueue改进步骤
2011/10/06 Javascript
JS实现在状态栏显示打字效果完整实例
2015/11/02 Javascript
canvas绘制表盘时钟
2017/01/23 Javascript
vue 2.0路由之路由嵌套示例详解
2017/05/08 Javascript
鼠标拖动改变DIV等网页元素的大小的实现方法
2017/07/06 Javascript
vue插件开发之使用pdf.js实现手机端在线预览pdf文档的方法
2018/07/12 Javascript
Node.js中读取TXT文件内容fs.readFile()用法
2018/10/10 Javascript
微信小程序实现的点击按钮 弹出底部上拉菜单功能示例
2018/12/20 Javascript
python检测服务器是否正常
2014/02/16 Python
Python连接MySQL并使用fetchall()方法过滤特殊字符
2016/03/13 Python
Python for Informatics 第11章之正则表达式(四)
2016/04/21 Python
EM算法的python实现的方法步骤
2018/01/02 Python
python排序函数sort()与sorted()的区别
2018/09/18 Python
python3使用matplotlib绘制散点图
2019/03/19 Python
Django 多表关联 存储 使用方法详解 ManyToManyField save
2019/08/09 Python
python2.7的flask框架之引用js&css等静态文件的实现方法
2019/08/22 Python
解决paramiko执行命令超时的问题
2020/04/16 Python
Tensorflow实现将标签变为one-hot形式
2020/05/22 Python
Python列表嵌套常见坑点及解决方案
2020/09/30 Python
python pyg2plot的原理知识点总结
2021/02/28 Python
ECCO爱步加拿大官网:北欧丹麦鞋履及皮具品牌
2017/07/08 全球购物
大学生涯自我鉴定
2014/01/16 职场文书
市场营销管理毕业生自荐信
2014/03/03 职场文书
2014年宣传思想工作总结
2014/12/10 职场文书
应聘教师自荐信
2015/03/26 职场文书
2016教师节感恩话语
2015/12/09 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书
20180830晚上第一届KSL半决赛 雨神vs解冻(二龙 三炮解说)
2022/04/01 星际争霸