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)
谢谢.
没有任何方法可以为您提供开箱即用的功能,但是有些人提出了与您已经处于相同情况的人的建议.
->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
| 归档时间: |
|
| 查看次数: |
7810 次 |
| 最近记录: |