如何在Laravel 5中以秒的方式使用调度程序.#

sha*_*kir 3 cron scheduler laravel

在那里我试图安排一些任务在larave,但我发现很难安排我的任务在每20秒.检查laravel doc.对于laravel计划,它没有这样的方法秒.虽然有 - > cron('******')"在自定义Cron计划上运行任务",但它也无法解决我的问题.

下面是我在kernal.php文件中用于调度的代码.

protected function schedule(Schedule $schedule)
{ 
    // need to replace everyMinute() by some other method which can run it every 20 sec

    $schedule->call('path\to\controller@method)->everyMinute();

   // also tried cron() but didn't workout.
    $schedule->call('path\to\controller@method)->cron(*/20 * * * * *);
}    
Run Code Online (Sandbox Code Playgroud)

谢谢.

Jam*_*mes 8

没有任何方法可以为您提供开箱即用的功能,但是有些人提出了与您已经处于相同情况的人的建议.

->cron(*/20 * * * * *)实际上是说每20分钟运行一次,而不是每20秒运行一次.鉴于cron没有达到亚分钟分辨率,这可能也是Laravel不支持它的原因.

如果这真的需要运行高于每30秒钟,然后我会去两这里的组合:Laravel 5计划作业每30秒Laravel程序器:执行命令每一秒

也就是说,你仍然应该每分钟调用一次命令,但添加withoutOverlapping()方法只是为了安全起见.

然后在你的命令中你可以运行你的代码,睡20秒,再次运行,睡20秒,然后再运行它.这显然是在您的代码几乎可以即时运行的前提下工作的.例如,如果您的代码需要5秒钟才能运行,然后您睡眠20秒然后再次运行 - 您的代码实际上每25秒运行一次.

我想你已经很清楚这段代码运行了多长时间.如果没有,请在运行artisan命令时手动计时以获得一个想法 - 这样的事情可能有所帮助date && php artisan your:command && date.这将在shell中输出日期,运行命令然后再次输出日期 - 这包括您可以用来查看运行所需的秒数的时间.

这将要求您将控制器操作重构为命令或将sleep()代码添加到控制器操作.工匠命令的文档应该在这里有所帮助.

我建议将其重构为命令,但这取决于你.

//Console command
public function handle()
{
    \App\Investment::calculate(); //takes 2 seconds to run
    sleep(18); //sleep for 18 seconds to ensure we are only running the command every 20 seconds
    \App\Investment::calculate(); //takes 2 seconds to run
    sleep(18);
    \App\Investment::calculate(); //takes 2 seconds to run
}


//The console scheduler - Kernel.php  
protected function schedule(Schedule $schedule)
{     
    $schedule->call('path\to\controller@method)->everyMinute()->withoutOverlapping();
}   
Run Code Online (Sandbox Code Playgroud)


小智 5

最近,Spatie 发布了一个软件包,使您能够以亚分钟的间隔安排命令。你可以做一些很酷的事情,比如:

protected function shortSchedule(\Spatie\ShortSchedule\ShortSchedule $shortSchedule)
{
    // this command will run every second
    $shortSchedule->command('artisan-command')->everySecond();

    // this command will run every 30 seconds
    $shortSchedule->command('another-artisan-command')->everySeconds(30);

    // this command will run every half a second
    $shortSchedule->command('another-artisan-command')->everySeconds(0.5);
}  
Run Code Online (Sandbox Code Playgroud)

参见spatie/laravel-short-schedule