TP6动态切换数据库、redis链接

浏览:4285 发布日期:2021/04/09 分类:ThinkPHP6专区 关键字: 数据库 redis 链接 连接 动态 切换 connect 队列 pdo
TP6动态切换数据库链接,支持不同数据库实例切换
业务场景是:按不同客户分数据库,各个库表结构一致,只是数据库名称不一致,此时可在中间件中,按传入业务参数获取对应数据库链接,再调用以下方法进行切换。    /**
     * @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;
    }
最佳答案
评论( 相关
后面还有条评论,点击查看>>