配置范例
1
2
3
4
5
6
7
8
9
10
11
|
'mysql' => [
'driver' => 'mysql' ,
'write' => [
'host' => '192.168.1.180' ,
],
'read' => [
[ 'host' => '192.168.1.182' ],
[ 'host' => '192.168.1.179' ],
],
...
]
|
或
1
2
3
4
5
6
7
8
9
10
11
12
13
|
'mysql' => [
'driver' => 'mysql' ,
'write' => [
'host' => '192.168.1.180' ,
],
'read' => [
'host' => [
'192.168.1.182' ,
'192.168.1.179'
],
],
...
]
|
扩展配置范例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
'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' ,
],
],
...
]
|
或者
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
'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' ,
],
...
]
|
公司数据库架构为一主多从,从库访问地址为唯一地址,该处方便负载均衡及扩展从库。所以最终线上采用的配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
'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
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
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数据库读写分离配置的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:http://blog.onlywan.cc/14847498744910.html