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

吾爱主题 阅读:132 2021-09-01 15:33:00 评论:0

配置范例

?
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

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容