在 PHP 中调度电子邮件警报的策略


Strategy For Scheduling Email Alerts in PHP

我正在用Laravel编写一个PHP项目。管理员可以将电子邮件警报排队以在特定日期/时间发送。自然的选择是将 Laravel 的 Queue 类与 Beanstalkd 一起使用(Laravel在内部使用 Pheanstalk(。

但是,管理员可以选择重新安排或删除尚未发送的电子邮件警报。我找不到删除特定任务的方法,以便我可以插入具有新时间的新任务。

完成这样的事情的常用技术是什么?我也对其他想法持开放态度。我不想使用 CRON,因为这些电子邮件的数量会很高,我宁愿重用已经测试过的解决方案来管理任务队列。

我自己在互联网上搜索过这样的答案。

这是我的发现:

豆茎

我认为 Beantalkd 中最简单的方法是使用它延迟作业的能力(给它几秒钟的延迟作为参数(。

然后,您可以执行日期数学运算,以捕获now()与理想情况下作业运行的时间(以秒为单位(之间的时间差异,并将作业延迟很长时间。

这里有一个例子(参见SO问题的第一个答案 - 它是在Python中,但你可以得到这个人在说/做什么的要点(

请注意,这并不能保证任务按时运行 - 延迟只是使作业在 X 秒后可用。当延迟的作业可用时,队列在处理任务上的落后程度决定了作业在实际中的运行时间。(如果您由于大量作业而排队落后,那么它不一定会完全按时运行!

拉维尔

Laravel's Queue有一个更高的方法,你可以使用它来代替push

与 Push 一样,您可以执行以下操作:

Queue::push('Some'Processing'Class', array('data' => $data));

使用 later() ,您可以执行以下操作:

$delay = 14400; // 4 hours in seconds
Queue::later($delay, 'Some'Processing'Class', array('data' => $data));

SaaS 选项

  1. Google App Engine 可以安排任务
  2. iron.io 可以安排任务(与拉拉维尔配合得很好!

其他语言

  1. Python的Celery有类似的选项来延迟工作(具有相同的警告(
  2. Ruby的resque有一个时间表,也有点适合这个