Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用Laravel调度一次性任务_Php_Laravel_Cron_Queue_Scheduled Tasks - Fatal编程技术网

Php 用Laravel调度一次性任务

Php 用Laravel调度一次性任务,php,laravel,cron,queue,scheduled-tasks,Php,Laravel,Cron,Queue,Scheduled Tasks,我目前正在努力为我的应用程序中的特定功能找出最佳逻辑 考虑这一点: 在数据库中创建记录 5小时后,该记录被删除。除非它在创建后已更新,否则在这种情况下,删除将在时间更新\u后5小时发生 我非常熟悉Laravel队列和cron作业等,并简要介绍了Laravel Task Scheduler,但实际上我正在努力解决的是该如何工作的逻辑 以下是我目前的算法(我知道这不是最好的解决方案): 记录是在数据库中创建的 在创建该记录4小时55分钟后,将为此特定记录安排一项任务(其目的是向用户发送通知,警告他们

我目前正在努力为我的应用程序中的特定功能找出最佳逻辑

考虑这一点:

  • 在数据库中创建记录
  • 5小时后,该记录被删除。除非它在创建后已更新,否则在这种情况下,删除将在时间
    更新\u后5小时发生
  • 我非常熟悉Laravel队列和cron作业等,并简要介绍了Laravel Task Scheduler,但实际上我正在努力解决的是该如何工作的逻辑

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

  • 记录是在数据库中创建的
  • 在创建该记录4小时55分钟后,将为此特定记录安排一项任务(其目的是向用户发送通知,警告他们其记录即将被删除)
  • 当任务执行时,它将检索记录并确保记录未被更新。如果任务已更新,它将从时间戳处的
    更新时间重置为4小时55分钟。如果没有更新,它将在5分钟后再次运行相同的任务,在最后删除记录之前,它将再次测试时间戳
  • 一旦记录被删除,任务也将被删除
  • 我对上述解决方案的担忧是,数据库中可能有大量的记录,因此这将导致日程安排中有大量的任务,这可能不是最好的主意

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


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

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

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


    这样做会更好吗?

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

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


    $this->release($timeuntilfivehoursferupdatedat)

    实际上我自己也想到了这一点,但明显的问题是,每分钟对数据库执行一次查询并不是最好的主意。此外,为了保持简单,我没有提到的一点是,检查项目是否已更新并不像执行SQL查询那样简单。数据库记录的用途如下:(感谢您的回复,但是,正如我在问题中提到的,我非常熟悉Laravel队列的工作原理等。我看不到有什么方法可以将队列项目延迟5个小时,我也看不到
    发布
    有什么帮助……嘿,根据文档,“release方法接受一个参数:您希望等待作业再次可用的秒数”,因此,如果您在理论上超过5小时,那么它应该在此时将作业提供给处理程序,然后检查更新的at是否已更改,并相应地进行操作。