当前位置:首页 > CMS教程 > 其它CMS > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2022-01-01 22:49:28 浏览: 评论:0 

今天小编就为大家分享一篇Laravel数据库读写分离配置的方法,具有很好的参考价值,希望对大家有所帮助,一起跟随小编过来看看吧。

配置范例

  1. 'mysql' => [ 
  2.  'driver' => 'mysql',  
  3.  'write' => [  
  4.  'host' => '192.168.1.180',  
  5.  ],  
  6.  'read' => [ 
  7.  ['host' => '192.168.1.182'],  
  8.  ['host' => '192.168.1.179'],  
  9.  ], 
  10.  ...  
  11. ] 

或

  1. 'mysql' => [ 
  2.  'driver' => 'mysql',  
  3.  'write' => [  
  4.  'host' => '192.168.1.180',  
  5.  ],  
  6.  'read' => [ 
  7.  'host' => [ 
  8.  '192.168.1.182', 
  9.  '192.168.1.179' 
  10.  ],  
  11.  ], 
  12.  ...  
  13. ] 

扩展配置范例

  1. 'mysql' => [ 
  2.  'driver' => 'mysql',  
  3.  'write' => [  
  4.  'host' => '192.168.1.180',  
  5.  'username' => 'write', 
  6.  'password' => 'write', 
  7.  ],  
  8.  'read' => [ 
  9.  [ 
  10.  'host' => '192.168.1.182', 
  11.  'username' => 'read1', 
  12.  'password' => 'read1', 
  13.  ],  
  14.  [ 
  15.  'host' => '192.168.1.179', 
  16.  'username' => 'read2', 
  17.  'password' => 'read2', 
  18.  ],  
  19.  ], 
  20.  ...  
  21. ] 

或者

  1. 'mysql' => [ 
  2.  'driver' => 'mysql',  
  3.  'write' => [  
  4.  'host' => '192.168.1.180',  
  5.  'username' => 'write', 
  6.  'password' => 'write', 
  7.  ],  
  8.  'read' => [ 
  9.  'host' => [ 
  10.  '192.168.1.179', 
  11.  '192.168.1.182', 
  12.  ], 
  13.  'username' => 'read', 
  14.  'password' => 'read',  
  15.  ], 
  16.  ...  
  17. ] 

公司数据库架构为一主多从,从库访问地址为唯一地址,该处方便负载均衡及扩展从库,所以最终线上采用的配置

  1. 'mysql' => [ 
  2.  'driver' => 'mysql',  
  3.  'write' => [  
  4.  'host' => '192.168.1.180',  
  5.  'username' => 'write', 
  6.  'password' => 'write', 
  7.  ],  
  8.  'read' => [ 
  9.  'host' => '192.168.1.179' 
  10.  'username' => 'read', 
  11.  'password' => 'read',  
  12.  ], 
  13.  ...  
  14. ] 

代码分析

授人以鱼不如授人以渔,之所以配置如此灵活的原因,以及如何查找到这些配置方式。主要通过查找代码,分析代码;相关代码都在下面粘出,这里就不做解释了,代码能说明一切;

路径:vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php

代码:

  1. class ConnectionFactory 
  2. { 
  3.  ... 
  4.  
  5.  /** 
  6.  * Get the read configuration for a read / write connection. 
  7.  * 
  8.  * @param array $config 
  9.  * @return array 
  10.  */ 
  11.  protected function getReadConfig(array $config) 
  12.  { 
  13.  $readConfig = $this->getReadWriteConfig($config, 'read'); 
  14.  
  15.  if (isset($readConfig['host']) && is_array($readConfig['host'])) { 
  16.  $readConfig['host'] = count($readConfig['host']) > 1 
  17.  ? $readConfig['host'][array_rand($readConfig['host'])] 
  18.  : $readConfig['host'][0]; 
  19.  } 
  20.  
  21.  return $this->mergeReadWriteConfig($config, $readConfig); 
  22.  } 
  23.    
  24.  ... 
  25.    
  26.  /** 
  27.  * Get a read / write level configuration. 
  28.  * 
  29.  * @param array $config 
  30.  * @param string $type 
  31.  * @return array 
  32.  */ 
  33.  protected function getReadWriteConfig(array $config, $type) 
  34.  { 
  35.  if (isset($config[$type][0])) { 
  36.  return $config[$type][array_rand($config[$type])]; 
  37.  } 
  38.  
  39.  return $config[$type]; 
  40.  } 
  41.    
  42.  ... 
  43.    
  44.  /** 
  45.  * Merge a configuration for a read / write connection. 
  46.  * 
  47.  * @param array $config 
  48.  * @param array $merge 
  49.  * @return array 
  50.  */ 
  51.  protected function mergeReadWriteConfig(array $config, array $merge) 
  52.  { 
  53.  return Arr::except(array_merge($config, $merge), ['read', 'write']); 
  54.  } 
  55.    
  56.  ... 
  57. } 
  58.    
  59.    
  60. class Arr 
  61. { 
  62.  ... 
  63.    
  64.  /** 
  65.  * Get all of the given array except for a specified array of items. 
  66.  * 
  67.  * @param array $array 
  68.  * @param array|string $keys 
  69.  * @return array 
  70.  */ 
  71.  public static function except($array, $keys) 
  72.  { 
  73.  static::forget($array, $keys); 
  74.    
  75.  return $array; 
  76.  } 
  77.    
  78.  ... 
  79.    
  80.  /** 
  81.  * Remove one or many array items from a given array using "dot" notation. 
  82.  * 
  83.  * @param array $array 
  84.  * @param array|string $keys 
  85.  * @return void 
  86.  */ 
  87.  public static function forget(&$array, $keys) 
  88.  { 
  89.  $original = &$array; 
  90.    
  91.  $keys = (array) $keys; 
  92.    
  93.  if (count($keys) === 0) { 
  94.  return; 
  95.  } 
  96.    
  97.  foreach ($keys as $key) { 
  98.  $parts = explode('.', $key); 
  99.    
  100.  while (count($parts) > 1) { 
  101.  $part = array_shift($parts); 
  102.    
  103.  if (isset($array[$part]) && is_array($array[$part])) { 
  104.   $array = &$array[$part]; 
  105.  } else { 
  106.   $parts = []; 
  107.  } 
  108.  } 
  109.    
  110.  unset($array[array_shift($parts)]); 
  111.    
  112.  // clean up after each pass 
  113.  $array = &$original; 
  114.  } 
  115.  } 
  116.    
  117.  ... 
  118. }

Tags: Laravel数据库读写分离配置

分享到: