首页 > 解决方案 > 处理多租户连接的最有效方法是什么?

问题描述

我正在创建一个由非常基本的 PHP/MySQL 连接组成的多租户 SaaS 产品。我正在使用单个数据库并将所有租户映射到tenantId数据库中的列。

我还使用子域为每个租户提供软件的前端/后端,因此在注册时,他们将获得类似company1.mysaas.dev. 他们的子域也映射到他们tenantId在数据库中。

所有租户的域都指向一个代码库/应用程序的相同入口点,因此在访问他们的域时,它需要映射到他们的配置文件/连接到他们tenantId在数据库中的文件以仅加载他们的文件。

这是我对index.php每个子域正在加载的文件所做的操作:

// Connect to Database
$db = new mysqli('localhost', 'root', '', 'saas');

// Check Connection
if ($db->connect_error) {
  die("Connection failed: " . $db->connect_error);
}

$domain = $_SERVER['HTTP_HOST']; // Get current domain
$stmt = $db->prepare('SELECT `tenant_id` FROM `domains` WHERE domain = ?');
$stmt->bind_param('s', $domain);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();

$tenantId = $row['tenant_id']; // Get Tenant ID based on current domain

if ($tenantId) {
  $serverConfig = "tenants/$tenantId/config.php";
  if (file_exists($serverConfig)){
    return require($serverConfig);
  } else {
    header("Location: https://mysaas.dev"); // No config file found, redirect back to app homepage
  }
} else {
  header("Location: https://mysaas.dev"); // No tenant ID found, redirect back to app homepage
}

在大多数情况下,上述内容是有效的,因为我只测试了一堆子域。

我的问题是,这是否是处理基于子域的传入请求的正确方法,或者在扩展时是否有更有效的方法?

如果有一千个人从不同租户的子域访问应用程序的入口点,这会扩展吗?

标签: phpmysqlserversaas

解决方案


推荐阅读