【问题标题】:Yii Dynamic DB Connection according to user with master database根据用户与主数据库的 Yii 动态数据库连接
【发布时间】:2013-01-25 05:32:14
【问题描述】:

我的项目是基于多租户SaaS的。

我有多个客户(公司),每个客户都有多个用户 - 他们都将使用相同的数据库布局。

每个客户都有自己的数据库,所以在用户身份验证期间,我想构建一个主数据库,将用户与该用户的公司数据库相关联。

每个数据库的结构都是一样的……只是数据不同。

这样我们就可以为不同的公司保留不同的数据库,这样就不会混入数据库中的数据。

在编写应用程序时,客户端的数量(以及数据库的数量)是未知的,因此无法在引导脚本中包含所有连接。

现在,我想做的是,动态更改引导程序中的数据库连接,或者能够为登录的用户动态创建新连接。在 Yii 中是否有一个简单的解决方案并且仍然使用AR,查询生成器?

我看到了这个解决方案,但对我不起作用http://www.yiiframework.com/forum/index.php?/topic/5385-dynamic-db-connection/

这就是我今天的配置文件在运行一个数据库的脚本时的样子,我想调用一个主数据库来控制用户属于哪个数据库以及应用程序在 Yii 中使用,知道吗?

<? php

 $language = 'en'; 

  $currencyBaseCode = 'USD';

 $theme = 'default';

 $connectionString = 'mysql:host=localhost;port=3306;dbname=master';

 $username = 'root';

 $password = 'YOUR PASS';

 $memcacheServers = array( // An empty array means memcache is not used.

 array(

'host' => '127.0.0.1',

'port' => 11211, // This is the default memcached port.


 'weight' => 100,

  ),

  );

  $adminEmail = 'EMAIL ADDRESS';

  $installed = true; // Set to true by the installation process.

  $maintenanceMode = false; // Set to true during upgrade process or other maintenance tasks.

  $instanceConfig = array(); //Set any parameters you want to have merged into configuration array.

  //@see CustomManagement

  $instanceConfig['components']['request']['hostInfo'] = 'website url';

  $instanceConfig['components']['request']['scriptUrl'] = '/app/index.php';

  $urlManager = array (); // Set any parameters you want to customize url manager. 
  ? >

【问题讨论】:

    标签: database yii multi-tenant


    【解决方案1】:

    在配置文件中定义主数据库,并使用普通的 AR 类连接到它以检索凭据。然后,关闭连接。

    然后extend the AR class, specifically the getDbConnection() method。获取相关凭据,并将它们作为参数传递给新的 CDbConnection 对象。

    获取凭据的初始 DB 请求将极大地拖累性能,因此您应该使用 Redis 或 Memcached 将它们真正存储在内存中。 Yii 本身并不这样做。

    有几种不同的方法:

    • 不同的前端控制器加载不同的配置文件,每个配置文件由单独的应用动态生成或销毁。
    • 一个大数据库。每条记录都有一个键来定义它属于哪个客户端。
    • 一个大数据库。可以使用客户端名称作为表名的一部分来复制表。

    对于 Yii 来说,这些都不是一件容易的事,因为这并不是 Yii 的设计初衷。

    【讨论】:

    • 但是它可以只用用户、密码、电子邮件、数据库名创建一个主数据库,当人们登录时它指向数据库名colom来查找数据库吗?和用户/通行证进行身份验证?我有点失落:)
    • @JesperQvist 是的,您可以这样做,但您应该避免这样做会对性能造成巨大影响。如果您将凭据存储在 Redis 中,那么访问相关客户端数据库将会快得多。
    • 所以我安装了 Redis 并将其作为主数据库,你建议我如何从那里进行更改,艰巨的任务还是简单的任务?
    • @JesperQvist 相当简单,使用 phpredis(或 predis)。如果客户端访问 client1.example.com,请使用 client1 作为包含数据库凭据的哈希的 Redis 键。为数据库管理员使用单独的 CRUD 来管理客户端凭据。在扩展的getDbConnection()方法中,调用Redis获取基于子域key的has。
    • 好的,知道了,所以每个客户端都需要一个子域然后...我在考虑一个主登录,例如 app.domain 。 com 但你的方法会改变我假设的方法......我不是铁杆这就是为什么我试图获得尽可能多的帮助,但坚持想弄清楚:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 2014-03-06
    • 2010-12-25
    • 2016-07-05
    相关资源
    最近更新 更多