1

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

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

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

4

1 回答 1

4

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

这是我发现的:

豆茎

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

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

这是一个示例(请参阅该 SO 问题的第一个答案 - 它在 Python 中,但您可以了解该人所说/所做的要点)

请注意,这并不能保证任务按时运行 - 延迟只会使作业在 X 秒后可用。当延迟的作业变得可用时,您的队列在处理任务时的落后程度决定了作业何时实际运行。(如果由于工作量大而导致队列落后,那么它不一定会准时运行!)

拉拉维尔

Laravel 的 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可以安排任务(与 Laravel 配合得很好!)

其他语言

  1. Python 的Celery具有类似的延迟作业选项(具有相同的警告)
  2. Ruby 的 resque 有一个时间表也很适合这个
于 2013-09-29T15:00:41.950 回答