Sex*_*yMF 4 scheduled-tasks laravel
我有一个系统,用户可以通过UI创建后台任务.
任务间隔是每隔几个小时(UI中的用户选择).
当用户通过ui创建任务时,我想动态地将它添加到调度程序.
如示例所示,这是静态的而不是动态的.
protected function schedule(Schedule $schedule)
{
$schedule->call(function () {
DB::table('recent_users')->delete();
})->daily();
}
Run Code Online (Sandbox Code Playgroud)
可能吗?如果没有,有哪些替代方案?
谢谢
Jon*_*hon 15
我不明白为什么不可能.Kernel::schedule每次运行时都会运行该方法php artisan schedule:run.如果你像文档一样设置它,应该是每分钟通过一个cron.
* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)
考虑到这一点,我不明白为什么你不能做这样的事情:
protected function schedule(Schedule $schedule)
{
// Get all tasks from the database
$tasks = Task::all();
// Go through each task to dynamically set them up.
foreach ($tasks as $task) {
// Use the scheduler to add the task at its desired frequency
$schedule->call(function() use($task) {
// Run your task here
$task->execute();
})->cron($task->frequency);
}
}
Run Code Online (Sandbox Code Playgroud)
根据您存储的内容,您可以使用此处的任何内容而不是CRON方法.您可能在数据库中存储了一个字符串,表示Laravel的预定义频率之一,在这种情况下,您可以执行以下操作:
$frequency = $task->frequency; // everyHour, everyMinute, twiceDaily etc.
$schedule->call(function() {
$task->execute();
})->$frequency();
Run Code Online (Sandbox Code Playgroud)
这里要注意的主要事情是,计划实际上并不是在数据库中的任务或它管理的cron中进行调度.每次调度程序运行(每分钟)它都会运行,并根据您为每项任务提供的频率确定要运行的内容.
例:
->hourly(),即每小时运行一次.00:00,计划运行,->hourly()过滤器通过,因为时间是在一小时,所以您的任务运行.00:01,计划运行,但这次->hourly()过滤器失败,因此您的任务不会运行.