我正在Laravel编写一个PHP项目。管理员可以将电子邮件警报排队以在特定日期/时间发送。自然的选择是使用Laravel的Queue类和Beanstalkd(Laravel在内部使用Pheanstalk)。
但是,管理员可以选择重新安排或删除尚未发送的电子邮件警报。我找不到删除特定任务的方法,以便我可以使用新的时间插入新的任务。
通常的技术是什么来完成这样的事情?我也对其他想法持开放态度。我不想使用CRON,因为这些电子邮件的数量非常高,我宁愿重复使用已经过测试的解决方案来管理任务队列。
答案 0 :(得分:4)
我自己在网上搜索过这样的答案。
这是我发现的:
我认为Beantalkd中最简单的方法就是利用其延迟工作的能力(给它作为一个参数延迟几秒钟)。
然后,您可以进行日期数学运算,以捕捉now()
与理想运行作业(以秒为单位)之间的时间差,并延迟作业。
Here's an example(参见那个问题的第一个答案 - 它是用Python编写的,但你可以得到这个人所说/做的事情的要点)
请注意,这并不能保证任务按时运行 - 延迟只是在X秒后使作业可用。当延迟的作业变为可用时,队列在处理任务时的方式决定了作业在实际运行的时间。 (如果因为大量工作而排队等待,那么它不一定能按时完成!)
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));