Php 在应用程序中记录用户活动

Php 在应用程序中记录用户活动,php,mysql,database,web-applications,Php,Mysql,Database,Web Applications,我在这里谈论的问题(当然是问)并不是新问题。我搜索了web和stack overflow,我对这个问题的许多方面(优点和缺点)都有了一些想法,但在我的脑海中仍然缺少一些想法。所以我认为在一个地方分享(当然,它会更完整地包含其他人的想法)并提出要求是个好主意 问题很明显:“我们想记录用户的每一个动作”-可能当我们解决大问题时,会记录小问题(比如只记录一个动作是小菜一碟) 首先,从我在web上读到的内容和堆栈溢出: 使用数据库而不是文件:这是一个很好的建议,尽管它总是取决于具体情况。但由于DB的许多

我在这里谈论的问题(当然是问)并不是新问题。我搜索了web和stack overflow,我对这个问题的许多方面(优点和缺点)都有了一些想法,但在我的脑海中仍然缺少一些想法。所以我认为在一个地方分享(当然,它会更完整地包含其他人的想法)并提出要求是个好主意

问题很明显:“我们想记录用户的每一个动作”-可能当我们解决大问题时,会记录小问题(比如只记录一个动作是小菜一碟)

首先,从我在web上读到的内容和堆栈溢出:

使用数据库而不是文件:这是一个很好的建议,尽管它总是取决于具体情况。但由于DB的许多好处,从长远来看,总的来说,它是更好的解决方案

数据库层或应用层:实际上这取决于具体情况。例如,如果您想真正监视数据库中的每一行(我的意思是真正监视数据库中更改的每一行),那么我们似乎只有一个选择“使用数据库触发器”。尽管围绕MySQL有很多讨论,其中说,触发减速DB,他们建议不要使用它。因此,这取决于您需要的详细程度,您可以将日志系统置于DB层应用层(对于考试,一些常见函数调用$logClass->logThis()

使用观察者:干净的代码总是更好。如果您熟悉观察者,您可以在操作发生时使用它们为您做一些事情,这样您就不必每次应用程序中发生CRUD时都添加$logClass->logThis()

要记录的内容:简单而简短的回答是:根据您的需要,但您需要一些常用字段:

  • 用户id(如果有唯一的用户id可用)
  • 时间戳(可能是unix)
  • ip(不是每个人都知道如何首先伪造它,所以使用它,即使伪造它也会让你对用户行为有所了解)
  • action_id(应该是预定义的操作,以便在查询和报告中更好地统一)
  • object_id(对其进行更改的记录的唯一行id)
  • 行动(我的问题是关于这部分的
  • 等等
如果有人纠正我在任何地方的错误,或者在这篇文章中添加其他有用的信息,我将不胜感激,这样它将成为其他用户的一个很好的参考

现在我的问题是:<强>如何存储动作?< /强>。为了更好地理解,请考虑下面的场景。

我有一个名为“product”的表和一个名为“Companys”的表。从业务逻辑来看,我们希望将产品分配给公司,结果是一个表“company\u product”。现在,当用户插入新产品并同时分配其公司时,将影响2个表(删除和更新也是如此):“product”和“company\u product”我们想知道:

  • 插入了什么
  • 删除了什么
  • 更新到什么
对于性能问题,由于我对触发器没有足够的了解,我想在应用程序层中使用日志记录,所以我最终的想法是,我可以将数据库的操作字段保存在数组json结构中。但在开发解决方案时,我遇到了一个问题:如何保存让非技术用户可以理解此日志?因为例如,当删除(插入)id为20的产品时,我想在数据库的操作字段中保存类似的内容:

action : [{id: 20, product_id:2, company_id: 1},{id: 21, product_id:2, company_id: 2}]
这对每个人来说都不是一件容易阅读和理解的事情。事实上,我可以使用这个json更具可读性,并使它像这样:

action : {'Product A Deleted From Company X', 'Product A Deleted From Company Y'}
并将上一个操作保存在technical_action字段中,以便进一步诊断,但需要额外的工作和更多的查询来运行一些并不总是需要考虑的内容(日志)


如果您能提供有关本文的任何其他信息(我肯定还有其他标准可以讨论),并回答我的问题,我将不胜感激。

您实际上将收集分析类内容的详细信息。 如果您选择平面表而不是关系表,这将是一件好事


因为如果你想做更多的分析,你的关系表将不是一个好的选择,因为它缺乏性能。

日志表是平面的,产品和公司的示例表之间的关系是关系的,实际上与讨论无关,并被视为一个例子。如果你指的是像NoSQL变体这样的平面数据库,它可以是光盘请在帖子上评论1,让我知道帖子或内容有什么问题。谢谢:我想知道这个主题对于每个人来说都是显而易见的,还是我们不考虑登录我们的项目?2天,社区不参与!