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

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

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

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

单数据库

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

  1. //数据库连接驱动
  2. DB_CONNECTION=mysql
  3. //数据库连接地址
  4. DB_HOST=127.0.0.1
  5. //数据库连接端口
  6. DB_PORT=3306
  7. //数据库
  8. DB_DATABASE=db_name
  9. //账号,密码
  10. DB_USERNAME=root
  11. DB_PASSWORD=123456

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

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

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

  1. 'mysql' => [
  2. 'read' => [
  3. //从数据配置 host 地址
  4. 'host' => env('DB_SLAVE_HOST', 'localhost'),
  5. ],
  6. 'write' => [
  7. //主数据配置 host 地址
  8. 'host' => env('DB_MASTER_HOST', 'localhost'),
  9. ],
  10. ...
  11. //其他相关配置不需要修改
  12. ]

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

  1. //数据库连接地址
  2. DB_MASTER_HOST = 127.0.0.1
  3. DB_SLAVE_HOST = 127.0.0.1

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

多数据库连接配置

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

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

  1. 'mysql' => [
  2. 'driver' => 'mysql',
  3. ...
  4. ],
  5. 'w2le' => [
  6. 'driver' => 'mysql',
  7. 'host' => env('DB_W2LE_HOST'),
  8. 'username' => env('DB_W2LE_USERNAME'),
  9. 'password' => env('DB_W2LE_PASSWORD'),
  10. 'port' => env('DB_W2LE_PORT'),
  11. 'database' => env('DB_W2LE_DATABASE'),
  12. ...
  13. ],

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

  1. DB_W2LE_HOST = 127.0.0.1
  2. DB_W2LE_USERNAME = root
  3. DB_W2LE_PASSWORD = 123456
  4. DB_W2LE_PORT = 3306
  5. DB_W2LE_DATABASE = w2le

如何指定数据库的连接?

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

  1. class Article extends Model
  2. {
  3. /**
  4. * 指定数据连接为 w2le
  5. *
  6. * @var string
  7. */
  8. protected $connection = 'w2le';
  9. }

DB 下指定 connection 使用

  1. DB::connection('w2le')->where(...);
  2. app('db')->connection('w2le')->where(...);

写/读库 切换

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

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

  1. class DatabaseManager implements ConnectionResolverInterface
  2. {
  3. ......
  4. /**
  5. * Prepare the read write mode for database connection instance.
  6. *
  7. * @param \Illuminate\Database\Connection $connection
  8. * @param string $type
  9. * @return \Illuminate\Database\Connection
  10. */
  11. protected function setPdoForType(Connection $connection, $type = null)
  12. {
  13. if ($type == 'read') {
  14. $connection->setPdo($connection->getReadPdo());
  15. } elseif ($type == 'write') {
  16. $connection->setReadPdo($connection->getPdo());
  17. }
  18. return $connection;
  19. }
  20. }

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

  1. DB::connection('w2le')->getPdo()
  2. DB::connection('w2le')->getReadPdo()