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和ACCESS写聊天室(五)
Oct 09 PHP
PHP一些常用的正则表达式字符的一些转换
Jul 29 PHP
php购物网站支付paypal使用方法
Nov 28 PHP
深入php list()函数的详解
Jun 05 PHP
PHP Class&Object -- 解析PHP实现二叉树
Jun 25 PHP
php登陆页的密码处理方式分享
Oct 14 PHP
PHP将字符分解为多个字符串的方法
Nov 22 PHP
PHP中Session和Cookie是如何操作的
Oct 10 PHP
PHP使用PHPExcel删除Excel单元格指定列的方法
Jul 06 PHP
利用PHP绘图函数实现简单验证码功能的方法
Oct 18 PHP
tp5递归 无限级分类详解
Oct 18 PHP
使用Git实现Laravel项目的自动化部署
Nov 24 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输出控制功能在简繁体转换中的应用
2006/10/09 PHP
学习PHP session的传递方式
2016/06/15 PHP
斜45度寻路实现函数
2009/08/20 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件
2010/08/24 Javascript
设置iframe的document.designMode后仅Firefox中其body.innerHTML为br
2012/02/27 Javascript
js 本地预览的简单实现方法
2014/02/18 Javascript
ext前台接收action传过来的json数据示例
2014/06/17 Javascript
js获取鼠标位置实例详解
2015/12/09 Javascript
详解node HTTP请求客户端 - Request
2017/05/05 Javascript
JS中的三个循环小结
2017/06/20 Javascript
npm全局模块卸载及默认安装目录修改方法
2018/05/15 Javascript
vscode 开发Vue项目的方法步骤
2018/11/25 Javascript
javascript原型链学习记录之继承实现方式分析
2019/05/01 Javascript
详解elementui之el-image-viewer(图片查看器)
2019/08/30 Javascript
Vue中jsx不完全应用指南小结
2019/11/01 Javascript
如何通过JS实现转码与解码
2020/02/21 Javascript
JavaScript监听一个DOM元素大小变化
2020/04/26 Javascript
vue实现信息管理系统
2020/05/30 Javascript
Python使用cookielib模块操作cookie的实例教程
2016/07/12 Python
解决Python requests 报错方法集锦
2017/03/19 Python
Python pyinotify日志监控系统处理日志的方法
2018/03/08 Python
对pycharm 修改程序运行所需内存详解
2018/12/03 Python
python模拟登陆,用session维持回话的实例
2018/12/27 Python
详解Python locals()的陷阱
2019/03/26 Python
Python龙贝格法求积分实例
2020/02/29 Python
Python Opencv轮廓常用操作代码实例解析
2020/09/01 Python
python list的index()和find()的实现
2020/11/16 Python
美国家居装饰和豪华家具购物网站:One Kings Lane
2018/12/24 全球购物
台湾专柜女包:KINAZ
2019/12/26 全球购物
Java Servlet API中forward() 与redirect()的区别
2014/04/20 面试题
求职自荐信格式
2013/12/04 职场文书
单位介绍信范文
2014/01/18 职场文书
公司合并协议书范本
2014/09/30 职场文书
社保缴纳证明申请书
2014/11/03 职场文书
信用卡工作证明范本
2015/06/19 职场文书
Python如何导出导入所有依赖包详解
2021/06/08 Python