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 相关文章推荐
第二节 对象模型 [2]
Oct 09 PHP
打造计数器DIY三步曲(中)
Oct 09 PHP
在PHP中使用反射技术的架构插件使用说明
May 18 PHP
php程序的国际化实现方法(利用gettext)
Aug 14 PHP
php全局变量和类配合使用深刻理解
Jun 05 PHP
CI框架在CLI下执行占用内存过大问题的解决方法
Jun 17 PHP
让ThinkPHP支持大小写url地址访问的方法
Oct 31 PHP
php实现的简单日志写入函数
Mar 31 PHP
Symfony查询方法实例小结
Jun 28 PHP
PHP实现基于面向对象的mysqli扩展库增删改查操作工具类
Jul 18 PHP
php ajax confirm 删除实例详解
Mar 06 PHP
php实现简单的守护进程创建、开启与关闭操作
Aug 13 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 缓存实现代码及详细注释
2010/05/16 PHP
PHP中数组定义的几种方法
2013/09/01 PHP
浅析ThinkPHP的模板输出功能
2014/07/01 PHP
php实现的中秋博饼游戏之绘制骰子图案功能示例
2017/11/06 PHP
网页javascript精华代码集
2007/01/24 Javascript
JS/jQ实现免费获取手机验证码倒计时效果
2016/06/13 Javascript
AngularJS实现给动态生成的元素绑定事件的方法
2016/12/14 Javascript
Angular项目从新建、打包到nginx部署全过程记录
2017/12/09 Javascript
node.js读取Excel数据(下载图片)的方法示例
2018/08/02 Javascript
ES6基础之字符串和函数的拓展详解
2019/08/22 Javascript
微信小程序HTTP请求从0到1封装
2019/09/09 Javascript
javascript设计模式 ? 观察者模式原理与用法实例分析
2020/04/22 Javascript
[55:04]海涛DOTA2死魂复燃6.82版本介绍
2014/09/28 DOTA
Python监控主机是否存活并以邮件报警
2015/09/22 Python
python制作最美应用的爬虫
2015/10/28 Python
Python的地形三维可视化Matplotlib和gdal使用实例
2017/12/09 Python
python实现指定文件夹下的指定文件移动到指定位置
2018/09/17 Python
使用python读取.text文件特定行的数据方法
2019/01/28 Python
Python3实现计算两个数组的交集算法示例
2019/04/03 Python
python操作日志的封装方法(两种方法)
2019/05/23 Python
解决Django提交表单报错:CSRF token missing or incorrect的问题
2020/03/13 Python
如何在Python 游戏中模拟引力
2020/03/27 Python
浅谈Python中的生成器和迭代器
2020/06/19 Python
python 合并多个excel中同名的sheet
2021/01/22 Python
详解HTML5新增标签
2017/11/27 HTML / CSS
英国综合网上购物商城:The Hut
2018/07/03 全球购物
英国的一家创新礼品和小工具零售商:Menkind
2019/08/24 全球购物
您熟悉ORM(Object-Relation Mapping)吗?请谈谈您所理解的ORM
2016/02/08 面试题
为什么要使用servlet
2016/01/17 面试题
网吧消防安全制度
2014/01/28 职场文书
幼儿教师演讲稿
2014/05/06 职场文书
三问三解心得体会
2014/09/05 职场文书
大学生思想道德自我评价
2015/03/09 职场文书
2016年学生会感恩节活动总结
2016/04/01 职场文书
教你怎么用Python生成九宫格照片
2021/05/20 Python
Python可视化学习之matplotlib内置单颜色
2022/02/24 Python