ggd*_*ras 5 php scheduler laravel laravel-4 laravel-5
我的问题更多的是一般的疑惑.我有两个使用Laravel创建的命令,我们称之为A和B.
这些命令中的每一个都使用 - > dailyAt($ par)方法进行调度.但$ par参数来自查询.
我的意思是这样的:
protected function schedule(Schedule $schedule)
{
$schedulerTime_commandA = App\Model\CommandsTime::where('id', 1)->first()->time;
$schedulerTime_commandB = App\Model\CommandsTime::where('id', 2)->first()->time;
$schedule->command('A')
->dailyAt($schedulerTime_commandA);
$schedule->command('B')
->dailyAt($schedulerTime_commandB);
}
Run Code Online (Sandbox Code Playgroud)
这是因为超级用户想要安排这些命令运行的时间.我的问题是:Laravel如何知道App\Console\Kernel.php文件中的此调度方法已被更改?
注意:我有以下cron条目,因为Laravel在文档上讨论它.
* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)
Laravel的调度程序系统的工作方式是它使用一个每分钟运行一次的cron作业(这是* * * * *cron条目中的一部分:匹配每年每个月每小时的每一分钟).
所以每一分钟php /path/to/artisan schedule:run >> /dev/null 2>&1都由cron运行.
当该命令运行时,它应该检查运行时schedule()内核类中的方法定义的调度.
从技术上讲,Laravel本身并不知道时间表已经改变.应该运行的每一分钟,点击schedule()方法,该方法将从数据库中获取最新值,然后返回在特定时刻设置的计划.
cron的每个单独运行都不知道它前面的那些,或者它之后的那些.
至少这是我对调度程序的理解.我只花了一点时间在核心的Laravel内核代码中,但我相信我自己的经验会发生什么.
希望有所帮助!
编辑1
刚刚在Laravel的代码中证实了我的逻辑.每次运行cron脚本时,都会重建计划,因此下次运行cron条目时将使用数据库中计划的更改.Laravel并不真正知道它发生了变化 - 它只是检查它每次运行并使用它发现的东西.
具体来说,如果感兴趣,这里是代码链:
php artisan命令行将在项目根目录中运行artisan文件;defineConsoleSchedule()方法;defineConsoleSchedule()方法初始化一个空白的Schedule对象(Illuminate\Console\Scheduling\Schedule);schedule()Kernel类上的方法; 最后schedule()您定义命令调度的方法中,将运行两个数据库查询,并使用数据库当时返回的值定义两个调度条目.每次控制台应用程序引导时都会发生上述操作,这意味着每次调用时php artisan,无论您希望运行什么命令.
特别是在运行schedule:run命令时,接下来会发生什么:
fire()在ScheduleRunCommand对象上调用该方法,该对象在应用程序引导时运行在Schedule对象上定义的所有命令; 和isDue()代表命令的事件(Illuminate\Console\Scheduling\Event)上的方法,检查每个命令以查看当时是否必须运行该命令; 最后true从isDue()将运行.| 归档时间: |
|
| 查看次数: |
2352 次 |
| 最近记录: |