Php 实施电子邮件通知
我有一个web应用程序,用户可以在其中创建主题,还可以对其他主题发表评论(类似于我们在stackoverflow上的内容)。我希望能够向参与讨论的用户发送通知 我知道最简单的方法是将通知挂接到用户与讨论交互时执行的脚本上。虽然这看起来很简单,但我认为这不是最合适的方式,因为用户需要等待所有电子邮件通知(通知脚本完成执行)发送,直到他获得其操作的状态 我知道的另一种选择是使用cronjob计划通知脚本的执行。为了使通知具有相关性,将计划每3到7分钟执行一次脚本,以确保用户在合理的时间内收到通知 现在我关心的是,将cronjob设置为每3分钟运行一次脚本会不会消耗合理的系统资源,因为我的应用程序仍在共享托管平台上运行 此外,我认为有可能出现这样一种情况:在注释脚本继续执行的同时,注释脚本将触发或通知通知脚本向指定的电子邮件地址发送通知,而无需等待通知脚本完成。如果这是可以实现的,那么我认为这将是我的最佳选择Php 实施电子邮件通知,php,email,cron,Php,Email,Cron,我有一个web应用程序,用户可以在其中创建主题,还可以对其他主题发表评论(类似于我们在stackoverflow上的内容)。我希望能够向参与讨论的用户发送通知 我知道最简单的方法是将通知挂接到用户与讨论交互时执行的脚本上。虽然这看起来很简单,但我认为这不是最合适的方式,因为用户需要等待所有电子邮件通知(通知脚本完成执行)发送,直到他获得其操作的状态 我知道的另一种选择是使用cronjob计划通知脚本的执行。为了使通知具有相关性,将计划每3到7分钟执行一次脚本,以确保用户在合理的时间内收到通知 现
非常感谢您抽出时间 除非您的通知脚本占用大量资源,每次运行时都会发送几十条或数百条消息,否则我不会担心在共享主机上每3-7分钟安排一次。事实上,如果您将其计划为3分钟,并且发现站点的性能下降,则将其增加到4分钟,以减少25%的资源。但这不太可能是个问题
至于启动后台进程,您可以通过系统调用
exec()
来实现。我会告诉您一个很好的答案。除非您的通知脚本占用大量资源,并且每次运行时都会发送几十条或数百条消息,否则我不会担心在共享主机上每3-7分钟安排一次。事实上,如果您将其计划为3分钟,并且发现站点的性能下降,则将其增加到4分钟,以减少25%的资源。但这不太可能是个问题
至于启动后台进程,您可以通过系统调用
exec()
来实现。我想告诉你一个很好的答案。IMO在每个“讨论交互”中添加一个“钩子”是迄今为止最干净的方法,避免让用户等待的一个技巧是在HTTP响应中发回一个内容长度头。行为良好的HTTP客户端应该读取指定数量的八位字节,然后关闭连接,因此,如果您使用适当的内容长度HTTP头(并设置ignore_user_abort)返回“status”响应,则最终用户不会注意到您的服务器端脚本实际上继续正常运行,在退出之前生成电子邮件通知(甚至可能几分钟)。IMO在每个“讨论交互”中添加一个“钩子”是迄今为止最干净的方法,避免让用户等待的一个技巧是在HTTP响应中发回一个内容长度头。行为良好的HTTP客户端应该读取指定数量的八位字节,然后关闭连接,因此,如果您使用适当的内容长度HTTP头(并设置ignore_user_abort)返回“status”响应,则最终用户不会注意到您的服务器端脚本实际上继续正常运行,在退出之前生成电子邮件通知(甚至可能是几分钟)。我不确定我是否同意这种方法,即在处理请求的同一过程中发送电子邮件是一种方法。一般来说,事情最好保持简单;尽可能快地满足请求,让后台流程完成所有的工作。当流量增加,服务器变得繁忙时,这种方法会缩短等待时间,让用户更快乐。它还将有助于分离您的关注点,这将有助于您以后的bug修复和重构
就我个人而言,我会创建一个在后台定期运行的脚本,并检查所有线程的新活动。如果线程有新活动,那么脚本可以向所有参与者发送通知电子邮件。这会将您发送电子邮件的逻辑与用于服务请求的逻辑分离,并在物理上将其分离-例如,如果您的SMTP服务器突然开始花费很长时间进行响应,则不会对您的请求响应时间产生决定性影响。此外,如果在高峰时间服务器太忙,您可以停止运行此脚本,让服务器集中精力处理请求
为了运行这个脚本,您当然可以使用CRON,并且按照建议,将它设置为每4分钟运行一次。但是,如果脚本花费的时间超过4分钟怎么办?您最终将同时运行两个脚本,可能会导致向某些用户发送两次相同的电子邮件。一个解决方案是使用Fat控制器,它是我用C编写的守护进程,可以周期性地运行任何脚本(PHP、Python、任何东西)——它基本上是任何东西的守护进程。关键是,它可以在前一个实例结束后的x秒运行一个新实例,因此您不必担心多个实例
Fat控制器非常可配置,可以在各种模式下运行,甚至可以处理多个并行进程。您可以在网站上阅读更多关于它和一些用例的信息:
我不确定我是否同意这样一种方法,即在处理请求的同一过程中发送电子邮件。一般来说,事情最好保持简单;尽快满足请求