来自数据库的Laravel调度程序cron选项

时间:2016-07-28 14:24:43

标签: laravel scheduled-tasks scheduler

我是laravel的新手。

我发现如何执行计划。 调度参数(频率,命令)存储在mysql表中。

我想到了一个解决方案: 使用file_put_contents在app / Console / Kernel中写入。

欢迎任何更好的主意。

提前致谢, 克里斯帕帕斯

2 个答案:

答案 0 :(得分:3)

某个命令的频率在多个级别上定义。服务器上的Cron entry每分钟调用一次调度。在您的计划程序中也有frequency options

让存储在数据库中的参数定义命令执行频率的一种可能性是向表中添加一个得执行的执行字段,并在命令模型中添加一个local scope来验证mysql中的调度参数表:

public function scopeReadyToExecute($query)
{
    return $query->where('executed_at', '<=', Carbon::now()->subMinutes(5)->toDateTimeString());
}

在此示例中,频率为5分钟,当然您必须根据频率字段中的值更改此值。

现在,您可以在Kernel.php中定义master:命令,每分钟执行一次:

$schedule->command('master:command')->everyMinute() 

在master:command的句柄中,调用scope函数来获取准备执行的命令:

public function handle()
{
    $commands = Command::readyToExecute()->get();

    foreach ($commands as $command) {
        $this->call($command->name)
    }
}

将执行根据表中定义的参数准备执行的每个命令。

祝你好运!

答案 1 :(得分:2)

这是我的解决方案。

应用程序/控制台/ Kernel.php

    $report_schedules = ReportSchedule::all();
    foreach ($report_schedules as $report_schedule) {

        $method_name = (string)$report_schedule->report->method_name;
        $schedule->call(function () use ($method_name, $report_schedule) {
            $emailSchedules = new EmailSchedules();
            $email_List=array_unique(array_merge($report_schedule->users()->get()->lists("email")->toArray(), $report_schedule->groups()->with(["users"=>function ($query){$query->select("email");}])->get()->toArray()));
            $users=\App\User::whereIn("email",$email_List)->get(["first_name","last_name","email"]);
            $users_to=[];
            $emails_to=[];
            foreach($users as $user){
                array_push($users_to,$user->first_name." ".$user->last_name);
                array_push($emails_to,$user->email);
            }

            $emailSchedules->$method_name($emails_to,$users_to);
        })->cron($report_schedule->frequency)->name('mail')->timezone("Europe/Athens");
    }

希望将来帮助某人。