php - 处理多租户连接的最有效方法是什么?
问题描述
我正在创建一个由非常基本的 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
}
在大多数情况下,上述内容是有效的,因为我只测试了一堆子域。
我的问题是,这是否是处理基于子域的传入请求的正确方法,或者在扩展时是否有更有效的方法?
如果有一千个人从不同租户的子域访问应用程序的入口点,这会扩展吗?
解决方案
推荐阅读
- laravel - laravel中条件的嵌套关系
- assembly - 引用类型的对象数组如何存储在内存中?
- python - 身份验证方法已停止工作
- javascript - 第一次运行后停止此动画
- c++ - 为什么确定友元声明是否是其命名空间中的第一个如此重要?
- c# - XMLDocument 类 - 子节点 - 缩写加载与完全加载
- wordpress - 使用 Wordpress $wpdb 获取按 2 列排序的行结果
- postgresql - 在 AIX 7.1 上配置 psqlodbc-10.03.0
- android - 无法实例化一个或多个类:Navigation Drawer 和 Render Prob
- php - AWS 使用 StsClient 限制对临时凭证 getSessionToken 的访问