我如何在Laravel 5中以秒的方式使用调度程序。#
那里我试图在larave中安排一些任务,但是我发现很难在每20秒钟内安排我的任务。检查laravel文档。对于laravel schedular,它没有秒这样的方法。虽然有 - > cron('* * * * * *')“按照自定义Cron时间表运行任务”,但它也无法解决我的问题。我如何在Laravel 5中以秒的方式使用调度程序。#
以下是我在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\[email protected])->everyMinute();
// also tried cron() but didn't workout.
$schedule->call('path\to\[email protected])->cron(*/20 * * * * *);
}
谢谢。
没有任何方法可以为您提供开箱即用的功能,但对于与您已处于相同情境的人员有几点建议。
->cron(*/20 * * * * *)
实际上是说每20分钟运行一次,而不是每20秒运行一次。考虑到cron并没有达到次分辨率,这可能是Laravel不支持它的原因。
如果这真的需要运行高于每30秒钟,然后我会去两这里的组合:Laravel 5 schedule job every 30 seconds和Laravel schedular: execute a command every second
这就是说,你还是应该打电话给你的命令的每一分钟,但增加withoutOverlapping()
方法只是为了安全起见。
然后在您的命令中,您可以运行代码,休眠20秒,再次运行,休眠20秒,然后再次运行。这显然是在你的代码几乎是即时运行的前提下工作的。 例如,如果您的代码需要5秒运行,然后您休眠20秒,然后再运行一次 - 您的代码实际上每25秒运行一次。
我想你对这段代码运行需要多长时间有一个相当好的想法。如果没有,请手工计时,同时运行artisan命令以获取想法 - 类似这样可能有助于date && php artisan your:command && date
。 这将在您的shell中输出日期,运行命令然后再次输出日期 - 这包括您可以用来查看运行需要多少秒的时间。
这将要求您将控制器操作重构为命令或将sleep()
代码添加到控制器操作中。手工命令的docs应该在这里帮助。
我建议将此重构为一个命令,但这取决于您。
//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\[email protected])->everyMinute()->withoutOverlapping();
}
的事情是我们无法处理调度秒的基础上,但我们可以通过调用基于需要多少时间来执行如我们的方法的次数定制时间表()方法的接近:
$obj = new ClassName();
$schedule->call(function() use ($obj) {
sleep(3);
//call method calculate time it takes and based on that we can call method number of methods we want
$obj->method(); //call method
sleep(3); // pause of 3 seconds
$obj->method(); //call again
sleep(3);
$obj->method(); //call again
sleep(3);
})->everyMinute();
在这里,我能够在一分钟内根据执行时间的多少来调用我的方法三次。 谢谢我完成了我的工作。
谢谢你的想法。 – shakir
如果您觉得它有用,请随时上传和/或接受答案 – James