当前位置:首页 > Lumen 下的数据库( Mysql )配置和管理

Lumen 下的数据库( Mysql )配置和管理

发布于 2018-08-09 阅读 247 次 框架 Lumen Mysql PHP

Lumen 框架本身提供了丰富的数据库连接配置(Database),可以非常方便的配置多情况下的 Mysql 数据库连接。
比如默认下的单数据库,主从数据库配置,复杂业务的多数据连接配置。

单数据库

在小型简单的网站,项目下,一般只需要间的单实例数据库。而不需要应付特别复杂和大流量的访问。
Lumen 默认下是直接支持,只需要在 .ENV 配置文件中添加相关的数据库配置参数

//数据库连接驱动
DB_CONNECTION=mysql

//数据库连接地址
DB_HOST=127.0.0.1

//数据库连接端口
DB_PORT=3306

//数据库
DB_DATABASE=db_name

//账号,密码
DB_USERNAME=root
DB_PASSWORD=123456

主从连接配置(读写分离)

在流量比较大的网站中基本上都会用到数据库的主从。主数据库(Master)用来做数据的插入,删除和更新,从数据库(Slave) 只用做数据读取。也叫做数据库的读写分离。

主从的数据库配置稍微复杂一些,首先需要修改 config/database.php。关于 config 配置文件的使用,可以查看 Lumen的配置文件使用

'mysql' => [
    'read' => [
         //从数据配置 host 地址
        'host' => env('DB_SLAVE_HOST', 'localhost'),
    ],
    'write' => [
         //主数据配置 host 地址
        'host' => env('DB_MASTER_HOST', 'localhost'),
    ],
    ...
    //其他相关配置不需要修改
]

修改 .ENV 配置,把单数据库 DB_HOST 修改为 DB_MASTER_HOST, DB_SLAVE_HOST 主从 host

//数据库连接地址
DB_MASTER_HOST = 127.0.0.1
DB_SLAVE_HOST  = 127.0.0.1

如果连接数据库的 账户,密码主从不一致。可以在 read 和 write 中分别配置

多数据库连接配置

这种情况一般出现在复杂的大项目中,不同的业务在不同的数据库。

复制 config/database.php mysql 默认配置文件,并修改 key 名称(用以 数据库名来命名, 这里我用 w2le 代替)

'mysql' => [
    'driver'    => 'mysql',
     ...
],


'w2le' => [
    'driver'    => 'mysql',
    'host'      => env('DB_W2LE_HOST'),
    'username'  => env('DB_W2LE_USERNAME'),
    'password'  => env('DB_W2LE_PASSWORD'),
    'port'      => env('DB_W2LE_PORT'),
    'database'  => env('DB_W2LE_DATABASE'),
    ...
],

然后在 .ENV 中添加相关配置即可

DB_W2LE_HOST     = 127.0.0.1
DB_W2LE_USERNAME = root
DB_W2LE_PASSWORD = 123456
DB_W2LE_PORT     = 3306
DB_W2LE_DATABASE = w2le

如何指定数据库的连接?

在对应 Model 文件中添加 connection 属性,指定数据库连接

class Article extends Model
{
    /**
     * 指定数据连接为 w2le
     *
     * @var string
     */
    protected $connection = 'w2le';
}

DB 下指定 connection 使用

DB::connection('w2le')->where(...);

app('db')->connection('w2le')->where(...);

写/读库 切换

#通过 connection_name::write/read
DB::connection('w2le::write')

Illuminate\Database\DatabaseManager 类中 setPdoForType 方法中可以看到 write/read 的切换

class DatabaseManager implements ConnectionResolverInterface
{
    ......

    /**
     * Prepare the read write mode for database connection instance.
     *
     * @param  \Illuminate\Database\Connection  $connection
     * @param  string  $type
     * @return \Illuminate\Database\Connection
     */
    protected function setPdoForType(Connection $connection, $type = null)
    {
        if ($type == 'read') {
            $connection->setPdo($connection->getReadPdo());
        } elseif ($type == 'write') {
            $connection->setReadPdo($connection->getPdo());
        }

        return $connection;
    }
}

所以我们亦可以通过 connection 来获取 PDO 操作的句柄来获取 write/read

DB::connection('w2le')->getPdo()
DB::connection('w2le')->getReadPdo()