多租户多客户端多个数据库,一个源代码-PHP

时间:2018-08-07 10:23:25

标签: php mysql multi-tenant multiple-databases

由于该应用程序有很多客户,因此我有一个任务来创建一个现有的多租户项目。

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

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

但是,正如您所知,源现在有多个数据库不同的客户端,因此我们被困在与客户端管理数据库的过程中。

最初,

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

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

以此类推。

现在,在 index.php 页面中,重定向到login.php,但是未根据客户端为数据库设置配置。

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

谢谢。

1 个答案:

答案 0 :(得分:2)

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

我想您将通过在公用数据库中查找用户,然后使用password_verify()验证密码来对用户进行身份验证,只要您知道自己有有效的用户,就可以

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

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

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

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

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

希望重新考虑使用多个数据库的设计决定还为时不晚。