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