实施电子邮件通知

时间:2011-08-23 01:49:50

标签: php email cron

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

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

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

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

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

非常感谢你的时间。

3 个答案:

答案 0 :(得分:0)

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

就启动后台进程而言,您可以通过对exec()的系统调用来实现这一目标。我会引导你this question寻求一个很好的答案。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我不确定我是否同意在提供请求的同一过程中发送电子邮件的方法。一般来说,最好保持简单;尽快为请求提供服务,让后台流程尽一切努力。当流量增加且服务器忙碌时,这种方法将使等待时间缩短,用户更快乐。它还有助于区分您的问题,这将有助于您以后修复错误和重构。

就个人而言,我会创建一个在后台定期运行的脚本,并检查所有线程是否有新活动。如果线程有新活动,则脚本可以向所有参与者发送通知电子邮件。这将您发送电子邮件的逻辑与用于处理请求的逻辑分开,并将它们物理地分开 - 例如,如果您的SMTP服务器突然开始花费很长时间来响应,它将对您的请求响应时间没有任何影响。此外,如果在高峰时间您的服务器太忙,您可以停止运行此脚本,让服务器集中精力处理请求。

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

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

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