翻译GitHubhttps://github.com/yuansir/diving-laravel-zh原文链接https://divinglaravel.com/task-scheduling/before-the-diveImagine在这种情况下,作为大型SaaS的开发人员,您的任务是找到一种方法在周末每分钟选择10个随机客户并为他们提供折扣升级,发送折扣的工作可能非常简单,但我们需要一种方法每分钟运行一次,为此让我为那些不熟悉它的人分享关于CRON的简要介绍。方式,并提供折扣升级,发送折扣的工作可能很简单,但我们需要分分钟运行,所以我为不熟悉CRON的朋友分享一些CRON的简单介绍。CRONCRON是一个驻留在您的Linux服务器中的守护进程,它大部分时间都没有醒来,但每分钟它都会睁开眼睛,看看是否该运行分配给它的任何特定任务,您可以使用crontab与该守护进程通信文件,在最常见的设置中,该文件可以位于/etc/crontab,这里是crontab文件的样子:在它睁开眼睛查看是否有任何给定任务正在运行的那一刻,您使用crontab文件与此守护进程通信,在大多数常见的设置文件中,可以位于/etc/crontab中,crontab文件可能如下所示:001**/home/full-backup00***/home/partial-backup30510**/home/check-subscriptions在crontab文件中每一行代表一个定时任务,每个任务定义包含两部分:*部分代表该作业运行的计时器。第二部分是应该在crontab文件中运行的命令e、每一行代表一个定时任务作业,每个作业定义包含两部分:*部分代表作业运行设备的时间。第二部分是命令CRON计时语法5个星号依次表示:第一个示例中的01**表示作业应在每个月的第一天、上午12点、整点的第一分钟运行。或者简单地说,它应该在每个月的第一天中午12:00运行。001**在第一个示例中,这意味着该作业应在每个月的第一天中午12:00运行。一天的第一天,即上午12:00,在每小时的第一分钟运行。或者简单地说,它应该在每个月的第一天的凌晨12:00运行。第二个示例中的0****表示该作业应每小时运行一次。第二个示例中的0****表示该作业应每小时运行一次。30510**表示该作业应在每月10日上午5:30运行30510**表示该作业应在每月10日上午5:30运行**3表示作业应在星期三每分钟运行一次。****1-5表示作业应在星期一至星期五每分钟运行一次。01,15***表示作业应在每天凌晨1点和下午3点运行两次。*/10****表示作业应每10分钟运行一次。以下是一些其他示例:****3表示作业应在星期三每分钟运行一次。****3表示作业应在星期三每分钟运行一次。****1-5表示作业应在周一至周五每分钟运行一次。****1-5表示作业应在周一至周五每分钟运行一次。01,15***表示该作业应每天在凌晨1点和下午3点运行两次。01,15***表示该作业应每天在凌晨1点和下午3点运行两次。*/10****表示作业应每10分钟运行一次。*/10****表示作业应每10分钟运行一次。那么我们为我们的工作注册一个cron任务?那么我们为我们的工作注册一个cron任务?是的,我们可以简单地在我们的crontab文件中注册它:****php/home/divingLaravel/artisansend:offer这个命令将通知CRON守护进程每分钟运行phpartisansend:offerartisan命令,很简单吧?但是,当我们只想在星期四和星期二或每月的特定日期每分钟运行一次命令时,它就会变得混乱,必须记住cron作业的语法并不是一件容易的事,而且还必须更新crontab文件有时你想要添加新作业或更新计划可能会非常耗时,因此Laravel的几个版本添加了一些有趣的功能,为skschedulingta提供了易于记忆的语法:此命令将通知CRON守护进程运行phpartisansend:offerartisancommand每一分钟,是不是很简单?但是当我们想在星期四和星期二或每个特定的日子每分钟运行一个命令时就会变得混乱,记住cron作业的语法不是一件容易的事,而且还需要更新crontab文件,你想添加一个新的计划作业或更新可能非常耗时,所以在Laravel发布几次之后添加了一些有趣的功能来为调度作业提供易于记忆的语法:$schedule->command('send:offer')->everyFiveMinutes()->wednesdays();您只需在您的crontab和laravel负责处理引擎盖下的其余部分:您只需要在crontab中注册一个cron作业,laravel将处理其余部分:*****php/divingLaravel/artisanschedule:run>>/dev/null2>&1YoumaydefineyourscheduledcommandsinsidetheschedulemethodofyourApp\Console\Kernelclass:你可以在你的App\Console\Kernel类的schedule方法中定义你的计划命令:->command('send:offer')->everyFiveMinutes()->wednesdays();}如果您想了解有关不同计时器选项的更多信息,请查看官方文档。要了解有关不同计时器选项的更多信息,请查看官方文档当ConsoleKernel实例被实例化时,Laravel注册一个监听器到Kernel的启动事件,它将Scheduler绑定到容器并调用内核的schedule()方法:当ConsoleKernel被实例化时,Laravel发送内核的启动事件Register将Scheduler绑定到容器并调用内核的schedule()方法的侦听器://在Illuminate\Foundation\Console\Kernelpublicfunction__construct(Application$app,Dispatcher$events){$this->app->booted(function(){$this->defineConsoleSchedule();});}protectedfunctiondefineConsoleSchedule(){//在容器中注册调度器$this->app->instance(Schedule::class,$schedule=newSchedule($这个->应用[缓存::类]));//调用我们在App\Console\Kernel中覆盖的schedule()方法$this->schedule($schedule);}一旦控制台内核完成Kernel类中定义的引导序列,就会触发此引导事件。一旦控制台内核完成了Kernel类中定义的引导序列,这booted事件被触发在Kernel的handle()方法中,Laravel检查FoundationApplication之前是否被启动,如果没有它调用Application的bootstrapWith()方法并传递控制台Kernel中定义的bootstrappers数组。在handle()方法中,Laravel检查Foundation\Application是否启动,如果没有,调用应用程序的bootstrapWith()方法,传递控制台Kernel中定义的引导程序数组。简单地说:当CRON守护进程每分钟调用phpartisanschedule:run命令时,控制台内核将被启动,您在App\Console\Kernel::schedule()方法中定义的作业将被注册到调度程序中。当CRON守护进程每分钟调用phpartisanschedule:run命令时,将启动控制台ConsoleKernel,并将您在App\Console\Kernel::schedule()方法中定义的作业注册到调度程序。schedule()方法将Illuminate\Console\Scheduling\Schedule的一个实例作为唯一的参数,这是用于记录你给它的作业的调度管理器,并决定每次CRON守护进程pingit.schedule()时应该运行什么方法调用Illuminate\Console\Scheduling\Schedule的一个实例作为唯一参数,这是计划任务管理器,用于记录您提供的作业并决定每次由CRON守护进程运行什么。转载请注明:转载自瑞安是菜鸟|LNMP技术栈笔记
