当前位置:首页 > 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.  ...  

  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.  ...  

扩展配置范例

  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.  ...  

或者

  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.  ...  

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

  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.  ...  

代码分析

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

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

代码:

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

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

分享到: