业务场景是:按不同客户分数据库,各个库表结构一致,只是数据库名称不一致,此时可在中间件中,按传入业务参数获取对应数据库链接,再调用以下方法进行切换。
/**
* @Description: 动态切换数据库, 根据需要返回db连接
* @param : $db_host 数据库host
* @param : $db_name 数据库名称
* @param : $tp_db 是否需要返回pdo实例(tp自带版, 即Db::connect后的连接) 默认true, 传入false则返回PHP原始PDO
* @param : $need_db 是否数据库名,否则返回数据库实例连接(用于创建新数据库)
* @return :
* @Author : KingFer
* @Date: 2020-10-26 20:22:24
*/
public static function choseDb($db_host, $db_name, $tp_db = true, $need_db = true)
{
//动态切换链接配置,因设计的所有数据库账号密码一致,此处只设置host和数据库名称,如需要账号和密码,可在此处添加
$db_config = config('database');
$db_config['connections']['wms_db']['hostname'] = $db_host;
$db_config['connections']['wms_db']['database'] = $db_name;
config($db_config, 'database');
$wms = config('database.connections.wms_db');
if ($tp_db) {
return Db::connect('wms_db', true);
} else {
$dns = 'mysql:host=' . $wms['hostname'] . ':' . env('wms_db.hostport') . ($need_db ? ';dbname=' . $wms['database'] : ';');
}
$db = new \PDO($dns, $wms['username'], $wms['password']);
return $db;
}
注意:如另写,需要操作Db::connect('wms_db', true); 第二个参数传入true才会强制重连,否则会调用旧的链接在业务场景中,可能还存在不断切换链接会增加数据库连接数,可以通过单次执行完后断开连接,参考以下链接:
http://www.thinkphp.cn/topic/71257.html
TP6动态切换redis链接,支持不同redis实例切换
public static function pushTpQueue($job, $data, $queue_name)
{
if (empty($data)) {
return false;
}
//动态切换链接配置, 换汤不换药, 均通过更改config中的值
$queue_config = config('queue');
$queue_config['default'] = 'redis';
//此处可以设置redis其他链接
$queue_config['connections']['redis']['host'] = 'xxx';
$queue_config['connections']['redis']['port'] = 'xxx';
$queue_config['connections']['redis']['password'] = 'xxx';
config($queue_config, 'queue');
// 将任务推送到消息队列等待对应的消费者去执行
$status = Queue::push($job, $data, $queue_name);
return $status;
}
最佳答案
