【Laravel】一主多从读写分离配置

本文深入探讨了Laravel配置读写分离时出现的重复配置问题,并通过剖析源码,揭示了正确的配置方式。提供了优化建议,帮助开发者更高效地配置数据库连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

错误范例

最近要配置laravel的读写分离,找了半天资料都是类似下面的这种形式。

'mysql' => array(
    'read' => array(
        'host' => '192.168.1.1',
     'host' => '192.168.1.3',
    ),
    'write' => array(
        'host' => '196.168.1.2',
'host' => '192.168.1.4',
    ),
    'driver'    => 'mysql',
    'database'  => 'database',
    'username'  => 'root',
    'password'  => '',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
),

一个array配置两个相同的key也是醉了,而且各个网站都是这么写的,爬数据能不能走点心。

求根溯源

无奈只能扒代码

在DB的连接工厂中找到以下代码

 .../vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php

/**
 * Get the read configuration for a read / write connection.
 *
 * @param  array  $config
 * @return array
 */
protected function getReadConfig(array $config)
{
    $readConfig = $this->getReadWriteConfig($config, 'read');
    
    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];
}
工厂类通过随机获取读DB配置来进行读取操作,由此可推出DB的配置应该如下

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

验证

开启MySQL的general-log,通过tail -f的方式监控log变化来确定配置是否生效。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值