答案 0 :(得分:5)
默认情况下,CRON任务计划在最短的1分钟内完成,但您的问题有解决方法。
在Console Kernel中你应该这样做:
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->command('your_command:run', ['--delay'=> 0])->everyMinute();
$schedule->command('your_command:run', ['--delay'=> 30])->everyMinute();
}
在Command类中,您应该定义可以使用delay参数的$signature
变量。
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'your_command:run {--delay= : Number of seconds to delay command}';
在handle方法中,您应该读取此参数的值,并使用内置sleep()
函数将此任务休眠特定秒数。
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
// code
sleep(intval($this->option('delay')));
}
此解决方案将每30秒运行一次任务,您可以将任务数量乘以不同的延迟。在这种情况下,您需要在内核类中编辑 schedule 方法。
答案 1 :(得分:-1)
我在Laravel docs ...
上有这个引用过去,开发人员为他们需要安排的每项任务生成了一个Cron条目。但是,这很令人头痛。您的任务计划不再处于源代码管理中,您必须通过SSH连接到服务器才能添加Cron条目。 Laravel命令调度程序允许您在Laravel本身内流畅而有表现地定义命令调度,并且您的服务器上只需要一个Cron条目。
您仍然需要使用Cron来运行您的任务,但是使用Laravel的计划,您只需在Cron上设置一个作业,并通过任务计划控制应用程序的所有作业。
示例:强>
在您的服务器上设置此cron:
* * * * * php /path/to/artisan schedule:run
它会每分钟调用Laravel命令调度程序,然后,Laravel会评估您的计划任务并运行到期的任务。
然后在您的文件 app / Console / Kernel.php 上,您可以将所有任务配置为以下代码:
$schedule->call(function () {
DB::table('recent_users')->delete();
})->daily();
$schedule->command('inspire')->hourly();