Laravel读写分离配置下如何查看当前连接的数据库?
查看Laravel读写分离实际连接节点的方法
当然可以,下面给你几种不用修改env造错就能查看实际连接数据库节点的方法:
1. 用dd()直接打印连接信息
在代码里(比如控制器方法、路由闭包)调用Laravel数据库门面的方法,获取连接的PDO实例并打印关键属性:
- 查看读连接的节点信息:
use Illuminate\Support\Facades\DB; use PDO; // 打印读连接的主机和端口 dd([ 'read_host' => DB::connection()->getReadPdo()->getAttribute(PDO::ATTR_HOST), 'read_port' => DB::connection()->getReadPdo()->getAttribute(PDO::ATTR_PORT), ]);
- 查看写连接的节点信息:
use Illuminate\Support\Facades\DB; use PDO; // 打印写连接的主机和端口 dd([ 'write_host' => DB::connection()->getWritePdo()->getAttribute(PDO::ATTR_HOST), 'write_port' => DB::connection()->getWritePdo()->getAttribute(PDO::ATTR_PORT), ]);
注意:由于你配置了
sticky => true,如果当前请求中先执行了写操作(比如插入、更新),后续的读操作会自动复用写连接,此时getReadPdo()返回的也会是写节点的信息。
如果当前上下文是写操作(比如执行DB::table('users')->insert(...)),直接调用DB::connection()->getPdo()也会返回写连接的PDO实例;读操作时则返回读连接实例。
2. 通过事件监听自动记录连接日志
监听Laravel的ConnectionEstablished事件,每次数据库连接建立时自动把节点信息写入日志:
- 生成事件监听器:
php artisan make:listener LogDatabaseConnection
- 在
app/Listeners/LogDatabaseConnection.php中编写逻辑:
namespace App\Listeners; use Illuminate\Database\Events\ConnectionEstablished; use Illuminate\Support\Facades\Log; use PDO; class LogDatabaseConnection { public function handle(ConnectionEstablished $event) { $connection = $event->connection; $pdo = $connection->getPdo(); Log::info('数据库连接已建立', [ '连接名称' => $connection->getName(), '主机' => $pdo->getAttribute(PDO::ATTR_HOST), '端口' => $pdo->getAttribute(PDO::ATTR_PORT), '数据库名' => $pdo->getAttribute(PDO::ATTR_DB_NAME), ]); } }
- 在
app/Providers/EventServiceProvider.php中注册事件和监听器:
protected $listen = [ \Illuminate\Database\Events\ConnectionEstablished::class => [ \App\Listeners\LogDatabaseConnection::class, ], ];
之后每次建立数据库连接,默认日志文件storage/logs/laravel.log里就会出现包含节点信息的日志条目。
3. 结合查询日志验证查询对应的节点
开启查询日志后,可以把查询记录和连接节点信息对应起来,验证某次查询用的是哪个节点:
use Illuminate\Support\Facades\DB; use PDO; // 开启查询日志 DB::enableQueryLog(); // 执行一个读查询 $users = DB::table('users')->get(); // 获取当前读连接的节点信息 $readConn = DB::connection()->getReadPdo(); // 输出查询记录和对应的连接节点 dd([ '读连接节点' => [ '主机' => $readConn->getAttribute(PDO::ATTR_HOST), '端口' => $readConn->getAttribute(PDO::ATTR_PORT), ], '查询记录' => DB::getQueryLog(), ]);
内容的提问来源于stack exchange,提问作者kyoshida
相关产品推荐
相关产品推荐

