【问题标题】:Scheduling one-off Tasks with Laravel使用 Laravel 安排一次性任务
【发布时间】:2017-01-01 06:39:35
【问题描述】:

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

考虑一下:

  1. 在数据库中创建了一条记录
  2. 5 小时后,该记录被删除。除非自创建以来已更新,在这种情况下,删除将在 updated_at 时间后 5 小时发生

我非常熟悉 Laravel 队列和 cron 作业等,我已经简要了解了 Laravel 任务计划程序,但我真正苦苦挣扎的是它应该如何工作的逻辑......

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

  1. 在数据库中创建记录
  2. 在创建记录 4 小时 55 分钟后为此特定记录安排了一项任务(这样做的目的是向用户发送通知,警告他们他们的记录即将被删除)
  3. 当任务执行时,它会检索记录并确保记录没有被更新。如果它已更新,它会将任务重置为从updated_at 时间戳开始的 4 小时 55 分钟。如果尚未更新,它将在 5 分钟后再次运行相同的任务,在最终删除记录之前再次测试时间戳。
  4. 一旦记录被删除,任务也会被删除

我对上述解决方案的担忧是,数据库中可能有大量记录,因此这将导致计划中的任务量非常大,这可能不是最好的主意...

谁能提出比上述更好的逻辑?

请注意,我不需要为我编写代码,我只是在寻求逻辑方面的帮助

【问题讨论】:

    标签: php laravel cron queue scheduled-tasks


    【解决方案1】:

    我可能过于简化了,但是下面的过程会更简单吗:

    1. 在数据库中创建记录
    2. 任务计划每分钟运行一次
      • 此任务正在查找 updated_at 值大于或等于当前时间的记录 - 我会为此使用 Carbon - 并从那里删除它们

    这将消除对队列的需求,并且仅在任务调度程序上运行。根据您正在处理的记录数量,您可能需要安排您的任务,以便它们不会重叠 - 但是使用本地数据库连接和一些有效的代码,您可以在一分钟内处理大量记录......

    这样会更好吗?

    【讨论】:

    • 其实我自己也想过这个问题,但显而易见的问题是,每分钟对数据库执行一次查询并不是最好的主意。另外,为了简单起见,我没有提到,检查项目是否已更新并不像执行 SQL 查询那么简单。数据库记录用于示例目的:(
    【解决方案2】:

    你应该能够通过排队的作业来做到这一点,Laravel 允许你指定它在处理程序再次处理之前的时间。请参阅下面链接上的“手动释放作业”。

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

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

    $this->release($timeUntilFiveHoursAfterUpdatedAt);

    【讨论】:

    • 感谢您的回复,但是,正如我在问题中提到的,我非常熟悉 Laravel 队列的工作方式等。我看不到可以将队列项目延迟 5 的方法小时,我无法以任何方式提供release 的帮助......
    • 嘿,所以根据文档,“发布方法接受一个参数:您希望等待工作再次可用的秒数”,所以如果您在理论上通过了 5 小时它应该在那时让处理程序可以使用该作业,然后检查更新的 at 是否已更改并相应地执行。
    猜你喜欢
    • 2016-09-30
    • 2017-02-17
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 2015-11-22
    • 2017-04-05
    相关资源
    最近更新 更多