首页 > 解决方案 > 多租户多客户端多数据库,一个源代码 - PHP

问题描述

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

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

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

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

最初,

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

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

等等..

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

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

提前致谢。

标签: phpmysqlmulti-tenantmultiple-databases

解决方案


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

我想您将通过在通用数据库中查找用户然后验证密码来验证您的用户,password_verify()当您知道您有一个有效用户时,您可以

  • 从您的用户数据库中检索数据库连接参数
  • 将它们存储在php 会话变量中
  • 使用 php 的安全会话 cookie 方案为用户的浏览器留下一种识别适当会话的方法。
  • 重定向后,或在后续的 Web 请求中,打开会话变量中提到的数据库

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

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

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

多租户在线应用程序的一个好的做法是在每个数据记录上放置客户 ID 或用户 ID 值,并使用WHERE customer_id = ?(current customer) 之类的查询子句来逐个用户分隔数据。

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


推荐阅读