【问题标题】:automatic emails from user account database来自用户帐户数据库的自动电子邮件
【发布时间】:2014-11-15 04:03:18
【问题描述】:

我有一个充满用户帐户和与这些用户帐户相关联的其他信息的数据库。我想为用户提供设置自动电子邮件的功能,通知他们新数据已添加到与其帐户链接的各种表格中。

我不是在寻找完整的代码,而是在寻找正确方向的一点。最后一天我一直在搜索和阅读,对此我看到了许多不同的意见。

目标是用户将定义一个电子邮件地址和检查新数据的速率。例如,他们提供 test@test.com 和 15 分钟。完成此操作后,我想每 15 分钟检查一次新数据是否已添加到他们的帐户中,如果是,请通过电子邮件提醒他们。编写实际代码来执行此操作没有任何问题,只是不确定脚本的调度和自动化处理它的“正确”方法。

  • MySQL 采用调度程序 - 我不能使用它,因为它不仅仅是严格的数据库操作。我需要按计划实际运行 php 代码(发送电子邮件和其他内容),而不仅仅是在数据库中执行操作。

  • Cronjob - 我可以完成这项工作,但是,这将是一个 cron 作业来检查我数据库中的每个用户,并且必须以我提供给我的用户的最短时间间隔(1 分钟)进行检查。当然,我对数据库的初始查询只会返回它实际需要检查的那些(当前时间戳>最后警报时间戳+速率秒)我认为每分钟在我的数据库的整个用户集上运行此脚本将是性能问题,尤其是随着用户群的增长。使用此选项,我认为脚本还需要一些文件锁定,以防止它多次运行。

  • 软件方面 - 由于数据库与用户安装在其计算机上的软件相关联,因此我还可以让软件以用户定义的速率间隔“命中”我创建的 php 脚本。如果他们将其设置为 15 分钟,那么它将每 15 分钟访问一次脚本进行检查。这也可以,但是随着用户群的增长,这是一个极端数量的对同一页面的相当频繁的点击,因为每个用户帐户都会在他们的间隔设置中这样做,但是,它也只会在软件运行时发生那个会减少那个数字的用户。

话虽如此,有什么建议吗?赞成和反对一种方法而不是另一种方法或其他一些我还没有遇到过的建议?

【问题讨论】:

  • 如果你用你尝试过的代码来简化问题,人们会很容易回答
  • 如果你阅读了我发布的内容,它会得到解释......就像我说的,我在编写代码时遇到了零问题。
  • 你不想做对的部分是什么?是检查 15 分钟间隔的 cron 还是查询?
  • 我想指出如何处理它的正确方向。我也没有创建 crons 的问题......我指出了我对上述不同选项的一些想法。该数据库中的用户数量每天都在增长,因此我将未来/长期视为实现自动化而不会出现问题的最佳方式。

标签: php mysql cron scheduled-tasks


【解决方案1】:

我的建议是不要让它基于时间,而是在每次有新内容时发送电子邮件。类似于有人在社交网络上发布您的帖子时收到一封电子邮件。不确定这是否符合您的业务需求。观察者设计模式浮现在脑海中,虽然有很多方法。

【讨论】:

  • 这是我最初的计划,但它可以非常轻松地一次向任何特定用户发送数百或更多电子邮件。我决定了用户选择的费率,以允许他们减少接收电子邮件的频率(我会将通知排队并一次发送所有通知)。速率设置为 15 分钟,已发送电子邮件...在接下来的 15 分钟内有 50 个警报为用户发送,并排入队列,直到允许再次发送电子邮件)...此时它将发送一封包含 50 个电子邮件的电子邮件队列中的警报。
【解决方案2】:

忘记软件端,您的检查需要驱动服务器端。

我会使用 cron 作业来做到这一点。你是对的,你的所有用户只有 1 个 cron 作业,但这不是问题。

假设您每分钟都有一个 cron 作业运行。在 cron 作业中,第一个任务将是根据当前时间和用户定期检查选项找到您需要验证他们是否发生了什么事情的用户。有时,您不会找到要检查的用户,有时是的。即使您有很多用户,也不会花费很长时间。然后,仅遍历需要检查的用户,并在需要时发送电子邮件。

【讨论】:

  • ...您认为这不会有问题吗?这是我昨晚看到的一篇文章,以及他们在使用这种方法时遇到的一些问题,这就是我推迟使用它的原因 - medium.com/@sunils34/…
  • 为什么不用要发送的消息填充另一个表(或数据库外的消息队列)? IE。通过触发器甚至事件调度程序。 cronjob 只处理这个表。
  • 查找用户验证的查询必须快速。之后,如果您需要验证 500 万用户,因为您的 500 万用户要求每分钟验证一次他们的帐户,是的,在这种情况下以及在其他所有情况下,这都是一个问题。我不知道您为您的网站计划的负载,但是关于数据库中 1 个用户的新事件的验证应该基于索引时间戳并且要快速。
  • @VMai - 这是一个有趣的想法。随着警报被添加到数据库中......如果要通知用户,我将其添加到 txt 文件中,该文件是数据库中所有用户的当前消息队列。 cron 然后根本不接触数据库......它只是读取 txt 文件,处理它,然后将它们发送出去。在我的脑海中,阅读 txt 文件并将需要发送到另一个文件或数组中的文件提取出来,同时从原始 txt 文件中删除它们......新文件/数组是消息发送出去,原件有待补充,下次再来。
  • @VMai - 实际上我设置站点的方式每个用户在服务器上都有一个特定的“文件位置”。我将它用于用户特定的文件、下载等。我可以轻松地为该区域的每个用户创建一个警报队列文件。然后,cron 将处理所有这些 txt 文件并发送需要哪些文件。我想知道这样的事情会有什么表现?有人愿意插话吗?
猜你喜欢
  • 2015-02-27
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
  • 1970-01-01
  • 2014-02-25
  • 2020-07-17
  • 2021-05-22
  • 2019-08-15
相关资源
最近更新 更多