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

时间:2013-09-28 17:13:26

标签: php laravel task-queue

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

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

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

1 个答案:

答案 0 :(得分:4)

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

这是我发现的:

Beanstalkd

我认为Beantalkd中最简单的方法就是利用其延迟工作的能力(给它作为一个参数延迟几秒钟)。

然后,您可以进行日期数学运算,以捕捉now()与理想运行作业(以秒为单位)之间的时间差,并延迟作业。

Here's an example(参见那个问题的第一个答案 - 它是用Python编写的,但你可以得到这个人所说/做的事情的要点)

请注意,这并不能保证任务按时运行 - 延迟只是在X秒后使作业可用。当延迟的作业变为可用时,队列在处理任务时的方式决定了作业在实际运行的时间。 (如果因为大量工作而排队等待,那么它不一定能按时完成!)

Laravel

Laravel的队列有一个later方法,您可以使用该方法代替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可以安排任务(适用于Laravel!)
  3. 其他语言

    1. Python的Celery有类似的选项来推迟工作(具有相同的警告)
    2. Ruby的resque有一个schedular,也适合这个