silverstripe / crontask
模块,用于按照标准的cron时间表运行任务
Requires
- php: ^8.1
- dragonmantank/cron-expression: ^3
- silverstripe/framework: ^5
Requires (Dev)
- phpunit/phpunit: ^9.6
- squizlabs/php_codesniffer: ^3
- 4.x-dev
- 3.x-dev
- 3.0.x-dev
- 3.0.4
- 3.0.3
- 3.0.2
- 3.0.1
- 3.0.0
- 3.0.0-rc1
- 3.0.0-beta1
- 2.x-dev
- 2.6.x-dev
- 2.6.3
- 2.6.2
- 2.6.1
- 2.6.0
- 2.6.0-rc1
- 2.6.0-beta1
- 2.5.x-dev
- 2.5.0
- 2.5.0-rc1
- 2.5.0-beta1
- 2.4.x-dev
- 2.4.0
- 2.4.0-rc1
- 2.4.0-beta1
- 2.3.x-dev
- 2.3.0
- 2.3.0-rc1
- 2.3.0-beta1
- 2.3.0-alpha1
- 2.2.x-dev
- 2.2.1
- 2.2.0
- 2.1.x-dev
- 2.1.3
- 2.1.2
- 2.1.1
- 2.1.0
- 2.0.x-dev
- 2.0.0
- 1.x-dev
- 1.2.x-dev
- 1.2.0
- 1.1.x-dev
- 1.1.2
- 1.1.1
- v1.1.0
- 0.9.x-dev
- dev-master
This package is auto-updated.
Last update: 2024-09-22 12:06:10 UTC
README
此模块让开发者能够通过代码配置类似cron的任务。
此模块有意不向CMS展示任何配置或日志,我们认为这些任务属于开发者和系统管理员。如果您想这样做,请参阅下面的“CMS驱动的调度器”部分。
模块解决了什么问题?
开发者不一定能访问服务器来配置cron作业,他们不得不依赖于系统管理员来代为操作。这可能会减缓开发周期,并且如果cron作业是手动设置的,可能会导致误解和错误配置。
此模块通过让系统管理员在服务器端设置单个通用的cron作业,并将实际的工作定义委托给PHP代码来解决这个问题。
CMS驱动的调度器
如果您正在寻找CMS可控的调度器,请查看queuedjobs模块。以下是使用该模块实现周期性作业的一些示例
安装
将以下内容添加到您的项目的composer.json中
{ "require": { "silverstripe/crontask": "^2.0" } }
运行composer update
(这将同时安装需要的第三方库到./vendor)
用法
在一个新类或已存在的类上实现CronTask
接口
use SilverStripe\CronTask\Interfaces\CronTask; class TestCron implements CronTask { /** * run this task every 5 minutes * * @return string */ public function getSchedule() { return "*/5 * * * *"; } /** * * @return void */ public function process() { echo 'hello'; } }
运行vendor/bin/sake dev/build flush=1
以使Silverstripe知道新的模块。
然后执行crontask控制器,您最好通过CLI执行此操作,因为服务器将按照这种方式执行它。
vendor/bin/sake dev/cron
服务器配置
Linux和Unix服务器通常预装了cron守护进程,按照时间表运行命令。如何配置这些可能差异很大,但最常见的方法是将文件添加到/etc/cron.d/
目录中。
首先找到要执行的正确命令,例如
/usr/bin/php /path/to/silverstripe/docroot/vendor/bin/sake dev/cron
然后找出Web服务器运行的用户,例如www-data
。
然后创建/编辑cron定义
sudo vim /etc/cron.d/silverstripe-crontask
该文件的内容应该是
* * * * * www-data /usr/bin/php /path/to/silverstripe/docroot/vendor/bin/sake dev/cron
这将作为www-data用户每分钟运行一次,并检查是否有任何需要执行的任务。
默认情况下,这将输出有关正在执行哪些cron任务的信息 - 如果您正在监控cron输出以查找错误,可以通过添加quiet=1来抑制此输出 - 例如
MAILTO=admin@example.com
* * * * * www-data /usr/bin/php /path/to/silverstripe/docroot/framework/cli-script.php dev/cron quiet=1
警告:注意,crontask模块不进行任何检查。如果您定义的任务每5分钟运行一次,那么它将在每5分钟运行一次,无论是否完成(就像常规cron一样)。如果‘每5分钟’任务在17:10开始,运行时间超过五分钟,它将在17:15启动另一个进程,可能会干扰仍在运行的过程。您可以选择使任务运行得更少,或者使用类似queuedjobs的东西,这允许作业在完成后在一定时间段后重新安排自己(参见上面的“CMS驱动的调度器”)。
有关如何调试和排除cron作业错误的更多信息,请参阅http://serverfault.com/a/449652。
getSchedule()方法
crontask控制器期望getSchedule返回一个作为cron表达式的字符串。
一些示例
* * * * *
- 每次都执行*/5 * * * *
- 每5分钟执行一次(例如00:05,00:10,00:15等)0 1 * * *
- 每天在01:00执行0 0 2 * *
- 每月2号在00:00执行0 0 0 ? 1/2 FRI#2 *
- 每两个月第二个星期五在00:00执行
示例
public function getSchedule() { return "0 1 * * *"; }
如果getSchedule()返回false、''或null,则假定此任务已禁用。如果getSchedule()返回配置变量的值,这可能会很有用。
/**
* How often to run this task.
*
* @var string
* @config
*/
private static $schedule = "0 1 * * *";
/**
* @inheritdoc
*
* @return string
*/
public function getSchedule()
{
return Config::inst()->get(static::class, "schedule");
}
process()方法
process
方法仅在任务需要执行时(根据getSchedule方法)才会执行。您在这里可以自行决定要做什么。您可以在其中执行工作,例如执行BuildTasks的run()方法。
public function process() { $task = FilesystemSyncTask::create(); $task->run(null); }
CRON表达式
CRON表达式是表示特定命令执行计划的字符串。CRON计划的组成部分如下
* * * * * *
- - - - - -
| | | | | |
| | | | | + year [optional]
| | | | +----- day of week (0 - 7) (Sunday=0 or 7)
| | | +---------- month (1 - 12)
| | +--------------- day of month (1 - 31)
| +-------------------- hour (0 - 23)
+------------------------- min (0 - 59)
有关允许的cron表达式的更多信息,请参阅第三方库创建者的Cron-Expression帖子。
贡献
您想贡献吗?太好了,请参阅CONTRIBUTING.md指南。
许可证
此模块在BSD 3-Clause许可证下发布,请参阅LICENSE。
行为准则
在讨论此模块的问题或拉取请求时,请遵守Silverstripe社区行为准则。
感谢
感谢Michael Dowling实际进行cron表达式的解析工作。
此模块只是对他代码的一个薄封装。