• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Laravel数据库读写分离配置的方法

    配置范例

    'mysql' => [
     'driver' => 'mysql', 
     'write' => [ 
     'host' => '192.168.1.180', 
     ], 
     'read' => [
     ['host' => '192.168.1.182'], 
     ['host' => '192.168.1.179'], 
     ],
     ... 
    ]

    'mysql' => [
     'driver' => 'mysql', 
     'write' => [ 
     'host' => '192.168.1.180', 
     ], 
     'read' => [
     'host' => [
     '192.168.1.182',
     '192.168.1.179'
     ], 
     ],
     ... 
    ]

    扩展配置范例

    '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',
     ], 
     ],
     ... 
    ]

    或者

    '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', 
     ],
     ... 
    ]

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

    '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

    代码:

    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数据库读写分离配置的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

    您可能感兴趣的文章:
    • Laravel如何友好的修改.env配置文件详解
    • Nginx中运行PHP框架Laravel的配置文件分享
    • Laravel框架环境与配置操作实例分析
    • Laravel 前端资源配置教程
    • laravel config文件配置全局变量的例子
    • Laravel 数据库加密及数据库表前缀配置方法
    • laravel框架数据库配置及操作数据库示例
    • laravel-admin自动生成模块,及相关基础配置方法
    • laravel 配置路由 api和web定义的路由的区别详解
    • Laravel5.6框架使用CKEditor5相关配置详解
    • Laravel配置全局公共函数的方法步骤
    • Laravel5框架自定义错误页面配置操作示例
    • laravel配置Redis多个库的实现方法
    • nginx实现一个域名配置多个laravel项目的方法示例
    • laravel 框架配置404等异常页面
    • Laravel 5.5官方推荐的Nginx配置学习教程
    • Laravel Memcached缓存驱动的配置与应用方法分析
    • Laravel 5+ .env环境配置文件详解
    上一篇:Laravel第三方包报class not found的解决方法
    下一篇:laravel实现前后台路由分离的方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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