【问题标题】:Is there a way to loop task scheduler?有没有办法循环任务调度程序?
【发布时间】:2017-08-04 02:26:33
【问题描述】:

我正在使用 Laravel 任务调度,并在 for 循环中从一堆 url 中抓取数据。这就是为什么我不确定一个周期何时结束。我试图在内核的schedule() 方法中设置一个for 循环,如question 中所述,但它似乎不能有效地工作。

protected function schedule(Schedule $schedule)
{
   $schedule->command('catalog:update')->everyMinute();
   sleep(5);
   $schedule->command('catalog:update')->everyMinute();
   sleep(5);
}

我想要实现的是检测任务何时完成,并相应地再次运行它。就像创建一个永无止境的循环一样,但它们不应该重叠,因为它不会让我认为之前的抓取完成(对吗?)。

所以我想要类似的东西:

protected function schedule(Schedule $schedule)
{
   $schedule->command('catalog:update');

   // Detect when completed {
   // run it again. Detect when completed again, etc as a loop. 
   //}

}

【问题讨论】:

    标签: php laravel cron crontab taskscheduler


    【解决方案1】:

    您不能在 schedule 方法中循环。应该做的就是定义一个 cron 计划。实际的命令不在 schedule 方法中运行。

    您可以让命令每分钟运行一次并将其设置为不重叠。这样,它将每分钟尝试启动命令,但如果前一次尝试仍在运行,它将跳过它。

    protected function schedule(Schedule $schedule)
    {
        $schedule->command('catalog:update')->everyMinute()->withoutOverlapping();
    }
    

    【讨论】:

    • 我想要实现的是检测作业何时完成并重新运行它。并保持循环。以task(); sleep(5) // x5 的身份处理会更好吗?
    • @senty 为什么每分钟都做不够好?您不能通过任务调度来做到这一点。你可以使用队列。在可排队的工作中完成所有工作。然后,一旦作业完成,让它向队列中添加一个新实例。
    • @senty 实际工作没有在 schedule 方法中完成。睡在那里对你没有好处。我认为您误解了任务调度程序的用途。
    • 从哪里开始研究队列?它是设置一个方法并触发一次,然后永远保持循环吗?也许这是我应该使用的,而不是你说的任务调度。
    • @senty 这取决于你。一种方法是创建一个简单地分派第一个作业的命令。然后在部署过程中运行该命令一次。
    猜你喜欢
    • 2021-04-28
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多