问题描述
我正在创建一个多租户SaaS产品,该产品由相当基本的PHP / MysqL连接组成。我正在使用单个数据库,并将所有租户映射到数据库中的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
}
在大多数情况下,当我仅测试一堆充满子域的内容时,上述方法就起作用了。
我的问题是,这是否是处理基于子域的传入请求的正确方法,还是在扩大规模时有更有效的方法?
如果有成千上万的人都从不同租户的子域中进入该应用程序的入口点,将会扩大规模吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)