Php 处理多租户连接的最有效方法是什么?

Php 处理多租户连接的最有效方法是什么?,php,mysql,server,saas,Php,Mysql,Server,Saas,我正在创建一个多租户SaaS产品,它由非常基本的PHP/MySQL连接组成。我使用单个数据库,并将所有租户映射到数据库中的tenantId列 我还使用子域为每个租户提供软件的前端/后端,因此注册后,他们将获得类似于company1.mysaas.dev的内容。它们的子域也映射到数据库中的tenantId 所有租户的域都指向一个代码库/应用程序的同一入口点,因此当访问他们的域时,需要映射到他们的配置文件/连接到数据库中的tenantId,以仅加载他们的文件 下面是我对每个子域正在加载的index.

我正在创建一个多租户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
}
在大多数情况下,上面的内容都在起作用,因为我只测试了一手子域

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


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

请使用带有参数的始终准备好的语句来防止sql注入请参见@nbk谢谢!是的,我必须在这里改进我的代码,以便生产部门处理错误和安全性。主要是想看看这是否是一种可扩展的方式来处理来自所有租户的传入请求的连接。请查看示例am php.com,了解如何检查是否给出了结果,你必须重新分配你的代码,这样你也可以添加这个。如果你要在这之后使用数据库连接,我建议你不要关闭它。这样做需要您创建一个新的连接,这不如重用相同的连接有效。关于扩展,这可以根据其背后的基础设施(服务器/负载平衡器等)进行扩展。当你看到需要的时候就去做吧。这个设计本身没有什么不可扩展的,我已经用这种方式通过一个应用程序运行了成千上万的子域。但是,我不会像这样将每个租户的配置放在单独的PHP源文件中。取而代之的是考虑将配置放入数据库中。您不希望每次添加租户时都必须编写、lint和部署代码。