将PHP脚本作为Cron Job发送电子邮件,避免多个进程

3
我正在开发一个提醒应用程序,用户可以通过选择时间和日期来向自己发送电子邮件的提醒。
因此,我将使用cron job来发送电子邮件,它将在每一分钟后运行,并检查是否有任何待发送的电子邮件。
现在,我的问题是,如果在任何给定时间我有50-100封电子邮件要发送,那么发送电子邮件可能需要超过1分钟,因此另一个cron job将开始运行相同的脚本。 这会有什么问题吗? 每分钟运行cron job会消耗服务器资源吗? 如果是这样,那么有哪些其他选项可以实现相同的功能。
请建议!!
谢谢
3个回答

3
使用锁文件策略...在启动新进程时创建一个锁文件,每个后续进程在启动前都应检查该锁文件是否存在。如果锁文件存在,则知道先前的进程仍在运行。
但是,您需要确保现有的锁文件仍然有效。可能是创建锁文件的进程退出而没有删除锁文件。将创建锁文件的进程的进程ID(PID)写入锁文件中。发现现有锁文件的后续进程应从文件中读取PID,然后确保该进程仍在运行。
此外,限制每个进程发送的消息数量是个好主意。如果保持开放式,您可能会遇到系统管理员杀死长时间运行的进程的问题。 :)

0

嗯,每当我通过PHP发送电子邮件时,我都会通过一个mailQ包装器来完成,它不会立即发送电子邮件,而是将其放入队列中以便发送(并通过其自己的独立脚本发送)。如果您采用相同的方法,您可以简单地将电子邮件添加到队列中(SQL表格中包含消息、收件人等信息以及指示是否已发送的标志)。

然后,您仍然可以每分钟运行脚本,然后有一个电子邮件脚本(查找邮件表格以查看是否有待发送的挂起消息)作为独立的cron作业运行-因此工作负载完全分离,作业应该并行运行。

我可以百分之百地保证,只要您的代码正确,每分钟运行一次作业永远不会成为问题。多年来,我一直在我的CMS中使用这种方法来平衡更新不是高优先级且只会减慢客户端浏览体验的内容的负载。

自从使用这种方法以来,我从未遇到过性能、负载或延迟问题,事情继续快速处理。

我同意AJ的观点,限制一次发送的消息数量非常重要。使用队列系统是理想的选择,因为它每次只会发送X个待处理的消息,而其他消息将会在队列中等待。


0
如果您使用Linux,可以使用此方法设置定期执行的服务,直到完成后等待一分钟等。

http://code.google.com/p/atomservice/

我经常用它来处理这种事情。你甚至可以设置每次执行发送x封电子邮件的限制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接