当前位置:编程学习 > > 正文

laravel 数据库迁移(Laravel数据库读写分离配置的方法)

时间:2021-10-01 01:27:28类别:编程学习

laravel 数据库迁移

Laravel数据库读写分离配置的方法

配置范例

  • ?
  • 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

    上一篇下一篇

    猜您喜欢

    热门推荐