2011-08-23 107 views
2

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

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

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

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

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

非常感谢您的时间。

回答

0

除非您的通知脚本耗费大量资源,并且在每次运行时发送数十条或数百条消息,否则我不会担心在共享主机上每3-7分钟就会调度一次。事实上,如果您预定了3分钟,并发现网站性能下降,那么将其提高到4分钟,资源减少25%。虽然这不太可能是个问题。

就开始后台进程而言,您可以通过系统调用exec()来实现该功能。我会直接给你this question一个很好的答案。

0

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

0

我不确定我是否同意这种方法,即在提供请求的同一个进程中发送电子邮件是一种方法。一般来说,最好简单一些;尽快提供请求并让后台进程尽一切努力。当流量增加并且您的服务器变得忙碌时,这种方法会使等待时间缩短,用户更快乐。它也将帮助分离您的疑虑,这将有助于您稍后修复错误和重构。

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

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

胖控制器是非常可配置的,可以在各种模式下运行,甚至可以处理多个并行进程。你可以阅读更多关于它和网站上的一些使用案例:

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