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 相关文章推荐
PHP5与MySQL数据库操作常用代码 收集
Mar 21 PHP
Warning: session_destroy() : Trying to destroy uninitialized sessionq错误
Jun 16 PHP
PHP的简易冒泡法代码分享
Aug 28 PHP
php实现zip压缩文件解压缩代码分享(简单易懂)
May 10 PHP
PHP生成短网址的3种方法代码实例
Jul 08 PHP
php从完整文件路径中分离文件目录和文件名的方法
Mar 13 PHP
php将图片保存为不同尺寸图片的图片类实例
Mar 30 PHP
php curl 获取https请求的2种方法
Apr 27 PHP
PHP表单数据写入MySQL数据库的代码
May 31 PHP
PHP简单实现冒泡排序的方法
Dec 26 PHP
完美解决在ThinkPHP控制器中命名空间的问题
May 05 PHP
php中钩子(hook)的原理与简单应用demo示例
Sep 03 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中实现SESSION的功能(一)
2006/10/09 PHP
thinkphp的CURD和查询方式介绍
2013/12/19 PHP
php抽象方法和普通方法的区别点总结
2019/10/13 PHP
鼠标经过的文本框textbox变色
2009/05/21 Javascript
jQuery 打造动态渐变按钮 详细图文教程
2010/04/25 Javascript
写自已的js类库需要的核心代码
2012/07/16 Javascript
js怎么判断flash swf文件是否加载完毕
2014/08/14 Javascript
js实现固定显示区域内自动缩放图片的方法
2015/07/18 Javascript
解决angular的$http.post()提交数据时后台接收不到参数值问题的方法
2015/12/10 Javascript
javascript日期格式化方法小结
2015/12/17 Javascript
jQuery插件imgPreviewQs实现上传图片预览
2016/01/15 Javascript
javascript插件开发的一些感想和心得
2016/02/28 Javascript
javascript和jquery实现用户登录验证
2016/05/04 Javascript
Jquery修改image的src属性,图片不加载问题的解决方法
2016/05/17 Javascript
jQuery easyUI datagrid 增加求和统计行的实现代码
2016/06/01 Javascript
Vue2.x中的Render函数详解
2017/05/30 Javascript
Angular2学习笔记之数据绑定的示例代码
2018/01/03 Javascript
微信小程序使用canvas的画图操作示例
2019/01/18 Javascript
vue中添加与删除关键字搜索功能
2019/10/12 Javascript
Python使用django获取用户IP地址的方法
2015/05/11 Python
Python基于动态规划算法解决01背包问题实例
2017/12/06 Python
Python生成器generator用法示例
2018/08/10 Python
python实现单链表中删除倒数第K个节点的方法
2018/09/28 Python
Html5游戏开发之乒乓Ping Pong游戏示例(三)
2013/01/21 HTML / CSS
HTML5中的Article和Section元素认识及使用
2013/03/22 HTML / CSS
英国度假别墅预订:Sykes Cottages
2017/06/12 全球购物
新加坡最佳婴儿用品店:Mamahood.com.sg
2018/08/26 全球购物
创业计划书撰写原则
2014/01/25 职场文书
优秀毕业生事迹材料
2014/02/12 职场文书
弄虚作假心得体会
2014/09/10 职场文书
合作与交流自我评价
2015/03/09 职场文书
2015年中学校长工作总结
2015/05/19 职场文书
2015年机关后勤工作总结
2015/05/26 职场文书
公司保洁员管理制度
2015/08/04 职场文书
2017寒假社会实践心得体会范文
2016/01/14 职场文书
关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
2022/04/04 Python