译文 GitHub https://github.com/yuansir/diving-laravel-zh
原文链接 https://divinglaravel.com/task-scheduling/before-the-dive
想象这种情况,作为一个大型 SaaS 的开发者,您需要找到一种在周末每分钟选择 10 个随机客户的方式,并提供折扣升级,发送折扣的工作可能非常简单,但我们需要每分钟运行一次,为此我分享一些 CRON 的简要介绍给还不熟悉人。
CRON 是一个守护进程,它驻留在你的 linux 服务器中,大部分时间都没有唤醒,但是每一分钟它都会睁开双眼,看看是否运行任何给定的任务,你使用 crontab 文件与该守护进程通信,在大多数常见的设置文件可以位于/etc/crontab
,crontab 文件可能看起来像这样:
0 0 1 * * /home/full-backup
0 0 * * * /home/partial-backup
30 5 10 * * /home/check-subscriptions
在 crontab 文件中,每行表示一个计划任务作业,每个作业定义包含两部分:
5 个星号按顺序排列如下:
示例:
0 0 1 * *
在第一个例子中,表示该工作应在每月,每个月的第一个天,上午 12 点,每小时第一分钟运行。 或者简单地说,它应该在每月的第一天上午 12:00 运行。0 * * * *
在第二个例子中,表示该工作应该每小时运行一次。30 5 10 * *
表示该工作应该在每个月 10 日上午 5:30 运行这里还有一些其他的示例:
* * * * 3
表示工作应该在星期三每分钟运行一次。* * * * 1-5
表示该工作应该每周一至周五运行。0 1,15 * * *
表示该工作应该每天在凌晨 1 点和 3 点运行两次。*/10 * * * *
表示该工作应该每 10 分钟运行一次。是的,我们可以在我们的 crontab 文件中注册:
* * * * php /home/divingLaravel/artisan send:offer
该命令将通知 CRON 守护程序每分钟运行 php artisan send:offer
artisan 命令,是不是很容易? 但是,当我们想要在星期四和星期二或每个特定日子里每分钟运行命令时会感到困惑,记住 cron 作业的语法不是一件容易的事,而且还需要更新 crontab 文件,你想添加一个新的工作或更新的时间表可能是相当耗时的时间,所以几个版本发布后 Laravel 添加了一些有趣的功能,为调度任务提供了一个容易记住的语法:
$schedule->command('send:offer')
->everyFiveMinutes()
->wednesdays();
你只需要在你的 crontab 中注册一个 cron 工作,laravel 会处理剩下的事:
* * * * * php /divingLaravel/artisan schedule:run >> /dev/null 2>&1
您可以在App\Console\Kernel
类的 schedule 方法中定义预定的命令:
protected function schedule(Schedule $schedule)
{
$schedule->command('send:offer')
->everyFiveMinutes()
->wednesdays();
}
如果您想了解有关不同计时器选项的更多信息,请查看 官方文档。
当 Console Kernel 被实例化时,Laravel 向内核的booted
事件注册一个侦听器,该事件将 Scheduler 绑定到容器并调用 kernel 的 schedule()方法:
// in Illuminate\Foundation\Console\Kernel
public function __construct(Application $app, Dispatcher $events)
{
$this->app->booted(function () {
$this->defineConsoleSchedule();
});
}
protected function defineConsoleSchedule()
{
// Register the Scheduler in the Container
$this->app->instance(
Schedule::class, $schedule = new Schedule($this->app[Cache::class])
);
// Call the schedule() method that we override in our App\Console\Kernel
$this->schedule($schedule);
}
一旦 console kernel 完成 Kernel 类中定义的引导顺序,这个booted
事件就被触发。
在 Kernel 的 handle()方法中,Laravel 会检查Foundation\Application
是否已启动,如果不是调用应用程序的 bootstrapWith()方法,并传递在 console Kernel 定义的引导程序数组。
当 CRON 守护程序每分钟都调用php artisan schedule:run
命令时,控制台 Console Kernel 将被启动,您在App\Console\Kernel::schedule()
方法中定义的作业将被注册到调度程序。
schedule()
方法调用Illuminate\Console\Scheduling\Schedule
的实例作为唯一的参数,这是用于记录您提供的作业的计划任务管理器,并决定每次 CRON 守护进程应该运行什么。
转载请注明: 转载自Ryan 是菜鸟 | LNMP 技术栈笔记
如果觉得本篇文章对您十分有益,何不 打赏一下
本文链接地址: 剖析 Laravel 计划任务–初探
本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可
Original url: Access
Created at: 2018-12-19 13:46:03
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论