可以用Laravel每X秒运行一次任务吗?

时间:2016-04-01 10:38:13

标签: laravel-5.2

Hy先生,我已经阅读了Laravel文档的调度章节,但是 我还没找到太多信息。我试图自定义任务的执行,使其每30秒运行一次。有解决方案吗? 对不起我的英语,祝你有个美好的一天。

2 个答案:

答案 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();