使用Laravel

时间:2016-08-25 00:34:32

标签: php laravel cron queue scheduled-tasks

我目前正在尝试为我的应用程序中的特定功能部分找出最佳逻辑。

考虑一下:

  1. 在数据库中创建记录
  2. 5小时后,该记录被删除。除非它自创建以来已更新,在这种情况下,删除将在updated_at时间后5小时发生
  3. 我非常熟悉Laravel队列和cron作业等,我已经简要介绍了Laravel Task Scheduler,但我实际上正在努力解决的是这应该如何运作的逻辑......

    这是我当前的算法(我知道它不是最好的解决方案):

    1. 在数据库中创建记录
    2. 在创建记录后的4小时55分钟内为此特定记录安排了一项任务(其目的是向用户发送通知,警告他们他们的记录即将被删除)
    3. 当任务执行时,它将检索记录并确保记录尚未更新。如果已更新,它会将任务重置为updated_at时间戳的4小时55分钟。如果它还没有更新,它将在5分钟后再次运行相同的任务,它将在最终删除记录之前再次测试时间戳。
    4. 删除记录后,任务也将被删除
    5. 我对上述解决方案的关注是数据库中可能存在大量记录,因此这将导致计划中的大量任务,这可能不是最好的想法......

      有人能提出比上述更好的逻辑吗?

      请注意,我不需要为我编写代码,我只是寻求一些逻辑上的帮助

2 个答案:

答案 0 :(得分:0)

我可能过度简化了这一点,但下面的过程会更简单:

  1. 在数据库中创建记录
  2. 任务计划每分钟运行一次
    • 此任务正在查找updated_at值大于或等于当前时间的记录 - 我只会使用Carbon - 并从那里删除它们
  3. 这将消除对队列的需要,并且只会在任务调度程序上运行。根据您正在处理的记录数量,您可能需要安排任务以使它们不重叠 - 但是对于本地数据库连接和一些有效的代码,您可以在一分钟内通过大量记录进行流失。 ..

    这会更好吗?

答案 1 :(得分:0)

您应该可以使用排队作业执行此操作,Laravel允许您指定处理程序再次处理之前的时间。请参阅"手动释放工作"在下面的链接上。

https://laravel.com/docs/5.2/queues#job-class-structure

然后,您可以创建某种形式的排队作业,并检查updated_at时间加上多长时间,然后将其与当前时间进行比较并将其释放到队列中达到该秒数,这意味着它应该运行一次或者两次取决于updated_at是否更改,从而最大限度地减少了检查数据库的需要。

$this->release($timeUntilFiveHoursAfterUpdatedAt);