PHP脚本作为Cron Job发送邮件,防止多个进程


PHP Script as Cron Job to Send Email, Prevent Multiple Processes

我正在开发一个提醒应用程序,用户可以通过选择提醒的时间和日期向自己发送电子邮件。

所以我将使用cron job来发送电子邮件,它将每分钟运行一次,并检查是否有电子邮件等待发送。

现在,我的问题是,如果在任何给定的时间我有50-100封电子邮件要发送,那么我认为发送电子邮件可能需要超过1分钟,所以另一个cron作业将开始运行相同的脚本。那有什么问题吗?每分钟运行cron作业是否消耗服务器资源?如果是,那么还有哪些选项可以实现相同的功能?

请建议!!

谢谢

使用锁文件策略…在启动新进程时创建一个锁文件,每个后续进程在启动前都应该检查该锁文件是否存在。如果锁文件存在,那么您就知道一个较早的进程仍在运行。

但是,您需要确保现有的锁文件仍然有效。可能是创建锁文件的进程没有删除锁文件就退出了。将创建锁文件的进程id (PID)写入到锁文件中。后面的进程如果找到一个现有的锁文件,应该从文件中读取PID,然后确保进程还在运行。

另外,限制每个进程发送的消息数量也是一个好主意。如果您保持它是开放式的,那么您可能会遇到系统管理员终止长时间运行的进程的问题。:)

如果你是在Linux上,你可以使用这个设置一个定期执行的服务,直到它完成,然后等待一分钟等。

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

我一直用它来做这样的事情。您甚至可以设置每次执行最多发送x封邮件的限制。

嗯,任何时候我通过PHP发送电子邮件都是通过mailQ包装器发送的,它不会立即发送电子邮件,而是将其放在一个队列中发送(并通过自己的独立脚本发送)。如果采用同样的方法,您可以简单地将电子邮件添加到包含消息、收件人等的队列(SQL表)中……和一个标志,表示是否发送)。

那么您仍然可以每分钟运行一次脚本,然后将电子邮件脚本(查找邮件表以查看是否有需要发送的待处理消息)作为独立的cron作业运行—因此工作负载完全分开,因为作业应该并行运行。

我可以百分之百地保证,只要你的代码是健全的,每分钟运行一个作业应该不是一个问题。多年来,我一直在我的CMS中使用这种方法来平衡更新那些不具有高优先级且只会降低客户端浏览体验的内容之间的负载。

自从使用这种方法以来,我从未遇到过性能,加载或延迟问题,并且事情继续迅速采取行动。

我同意AJ的观点,因为在一个批次中可以发送多少条消息是很重要的。使用排队系统是理想的,因为它一次只发送X个挂起,它们仍然会在队列中等待。