laravel 动态添加调度器
Posted
技术标签:
【中文标题】laravel 动态添加调度器【英文标题】:laravel add scheduler dynamically 【发布时间】:2016-12-12 14:00:11 【问题描述】:我有一个系统,用户可以通过用户界面创建后台任务。 任务间隔是每隔几个小时(用户在 UI 中选择)。
当用户通过 ui 创建任务时,我想将其动态添加到调度程序中。
如示例所述,这是静态的而非动态的。
protected function schedule(Schedule $schedule)
$schedule->call(function ()
DB::table('recent_users')->delete();
)->daily();
有可能吗?如果没有,有什么替代方案?
谢谢
【问题讨论】:
【参考方案1】:我不明白为什么这是不可能的。每次运行php artisan schedule:run
时都会运行Kernel::schedule
方法。如果你像文档一样设置它,应该每分钟通过一个 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()
过滤器失败,因此您的任务不会运行。
【讨论】:
我让它与可重用的命令一起工作(唯一的缺点是必须使用与您定义的命令相同的参数#,而不是真正动态地发送您想要的 GUI 允许的任何参数......但是我认为这很好,因为我的命令无论如何都必须知道传入的参数是什么,并且在 $signature 中定义了一个预设的#)。非常感谢您解释如何做到这一点......这是我到目前为止的代码:github.com/armyofda12mnkeys/laravel-task-gui-linkage以上是关于laravel 动态添加调度器的主要内容,如果未能解决你的问题,请参考以下文章