【问题标题】:Multi Tenancy Multiple Client Multiple Database, One Source Code - PHP多租户多客户端多数据库,一个源代码 - PHP
【发布时间】:2018-08-07 10:23:24
【问题描述】:

我的任务是为多租户创建一个现有项目,因为该应用程序有很多客户,所以我们决定这样做。

我们已经合并了我们的源代码以适用于任何数据库,所有客户端的所有源代码都是相同的。

现在,之前的数据库连接是使用每个脚本中包含的一个配置文件进行的。

但是,正如您所知,源现在有多个客户端,其中的数据库不同,我们坚持使用客户端管理数据库。

最初,

http://localhost/workspace/client/ --> 这是给客户端的 URL,现在我使用 htaccess 将它重定向到 index.php 并基于客户端/我知道这个包将使用哪个客户端。

有不同的客户, http://localhost/workspace/clien1/ http://localhost/workspace/clien2/ http://localhost/workspace/client3/

等等..

现在,在 index.php 页面重定向到 login.php,但没有根据客户端为 DB 设置配置。

如果有人处理过这个问题,请帮助我。

提前致谢。

【问题讨论】:

  • 在您在index.php 中重定向到login.php 之前,您应该设置一个cookie 或一个会话变量,指定应该为这个特定客户端使用哪个数据库配置。然后login.php可以读取cookie/session变量并设置相关的DB配置。
  • 您好 GELOV,感谢您的回答。在这种情况下,我在 COOKIE 之上选择了 SESSION,它正在部分工作。对在任何网络应用程序上存储会话的任何特定长度还有疑问?还是一次启动数千个会话会影响应用程序的性能?在这种情况下,最佳做法是什么?
  • 由于会话存储在服务器上 - 这集中了负载。实际负载将取决于您存储会话的方式(在文件系统上、通过igbinary PHP 扩展、在关系数据库中、在 Redis 中等)如果您使用 cookie - 您不必在服务器上存储任何内容因为 cookie 包含(以加密形式)用户 ID 和到期时间。对您的服务器的每个请求都会收到一个更新的 cookie 并带有新的过期时间 - 这样您就可以在收到过期的 cookie 时强制重新登录。

标签: php mysql multi-tenant multiple-databases


【解决方案1】:

在您建议的设置中,数据库连接参数(服务器地址、数据库用户名/密码和数据库名称)是您的用户或客户(您的用户组织)的属性。

我猜你会通过在公共数据库中查找用户来验证你的用户,然后使用password_verify() 验证密码当你知道你有一个有效用户时,你可以

  • 从您的用户数据库中检索 db 连接参数
  • 将它们存储在php session variables
  • 使用 php 的安全会话 cookie 方案让您的用户浏览器能够识别适当的会话。
  • 重定向后,或在后续的网络请求中,打开会话变量中提到的数据库

确保您放置的 cookie 不包含嵌入其中的数据库参数,否则网络犯罪分子会想出如何更改 cookie 以获得未经授权的访问。

但是,专业提示:众所周知,为每个客户创建一个新数据库是不可扩展的。如果

  • 您的项目是成功的,您发现自己有一天会增加一千个新客户?那天您必须添加一千个数据库。
  • 您在某个时刻有 500 个活动会话?它们每个都有自己的 dbms 连接,使 php 的连接池方案无用。连接池对于良好的 Web 应用程序性能至关重要。
  • 您需要执行一些涵盖所有客户的报告操作吗?您必须分别为每个客户运行报告,并弄清楚如何在您的报告程序中将它们合并在一起。这很难。

多租户在线应用程序的一个好的做法是在每条数据记录上放置客户 ID 或用户 ID 值,并使用像 WHERE customer_id = ?(当前客户)这样的查询子句来按用户分隔数据。

希望现在重新审视使​​用多个数据库的设计决策还为时不晚。

【讨论】:

  • 您好 O.Jones,感谢您的宝贵回复。你的猜测不正确。我们没有一个通用的数据库来验证用户。取而代之的是,我们根据 URL 确定他是哪个客户并在会话中设置数据库连接。和那项工作。我将与我的团队讨论这个答案,看看我们会做出什么决定。
最近更新 更多