【问题标题】:Implementing Email Notification实施电子邮件通知
【发布时间】:2011-11-01 14:24:08
【问题描述】:

我有一个 Web 应用程序,用户可以在其中创建主题并评论其他主题(类似于我们在 stackoverflow 上的内容)。我希望能够向参与讨论的用户发送通知。

我知道最简单的方法是将通知与用户与讨论交互时执行的脚本挂钩。尽管这看起来很简单,但我认为这不是最合适的方式,因为用户需要等到所有电子邮件通知(通知脚本完成执行)都被发送,直到他获得他的操作状态。

我知道的另一种选择是使用 cronjob 安排通知脚本的执行。为了使通知具有相关性,脚本将被安排为每 3 到 7 分钟执行一次,以确保用户在合理的时间内收到通知。

现在我担心的是,考虑到我的应用程序仍在共享托管平台上运行,将 cronjob 设置为每 3 分钟运行一次脚本会消耗合理的系统资源吗?

另外,我认为是否有可能出现这样一种情况,评论脚本将触发或通知通知脚本以将通知发送到指定的电子邮件地址,同时评论脚本继续执行而无需等待通知完成脚本。如果这可以实现,那么我认为这将是我的最佳选择。

非常感谢您的宝贵时间。

【问题讨论】:

    标签: php email cron


    【解决方案1】:

    除非您的通知脚本占用大量资源并在每次运行时发送数十或数百条消息,否则我不会担心在共享主机上每 3-7 分钟安排一次。实际上,如果您将其安排为 3 分钟并发现您的站点上的性能下降,则将其增加到 4 分钟以减少 25% 的资源。不过这不太可能是个问题。

    就启动后台进程而言,您可以通过对exec() 的系统调用来实现。我会引导你到this question 以获得很好的答案。

    【讨论】:

      【解决方案2】:

      IMO 为每个“讨论交互”添加一个“钩子”是迄今为止最简洁的方法,避免让用户等待的一个技巧是在 HTTP 响应中发回 Content-Length 标头。行为良好的 HTTP 客户端应该读取指定数量的八位字节,然后关闭连接,因此如果您使用正确的 Content-Length HTTP 标头(并设置 ignore_user_abort)发回“状态”响应,那么最终用户不会请注意,您的服务器端脚本实际上继续其愉快的方式,在退出之前生成电子邮件通知(甚至可能持续几分钟)。

      【讨论】:

        【解决方案3】:

        我不确定我是否同意在处理请求的同一进程中发送电子邮件是可行的方法。一般来说,最好保持简单;尽快处理请求,让后台进程完成所有工作。当流量增加并且您的服务器变得繁忙时,这种方法将减少等待时间并使用户更快乐。它还有助于分离您的顾虑,这将有助于您稍后修复错误和重构。

        就我个人而言,我会创建一个在后台定期运行并检查所有线程是否有新活动的脚本。如果线程有新活动,则脚本可以向所有参与者发送通知电子邮件。这将您发送电子邮件的逻辑与用于处理请求的逻辑分开,并且在物理上将它们分开 - 例如,如果您的 SMTP 服务器突然开始需要很长时间才能响应,它不会对您的请求响应时间产生不利影响。此外,如果在高峰时段您的服务器太忙,您可以停止运行此脚本,让服务器专注于处理请求。

        为了运行这个脚本,您当然可以只使用 CRON,并且按照建议,将其设置为每 4 分钟运行一次。但是,如果脚本耗时超过 4 分钟怎么办?您最终会同时运行两个脚本,这可能导致向某些用户发送两次相同的电子邮件。对此的一种解决方案是使用 The Fat Controller,它是我用 C 语言编写的一个守护进程,它可以定期运行任何脚本(PHP、Python 等)——它基本上是任何东西的守护进程。至关重要的是,它可以在前一个实例结束 x 秒后运行一个新实例,因此您不必担心多个实例。

        Fat 控制器非常可配置,可以在各种模式下运行,甚至可以处理多个并行进程。您可以在网站上阅读有关它的更多信息和一些用例:

        http://www.4pmp.com/fatcontroller/

        【讨论】:

          猜你喜欢
          • 2010-09-19
          • 1970-01-01
          • 2011-12-16
          • 2015-11-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多