silverstripe/crontask

模块,用于按照标准的cron时间表运行任务

安装量: 545 999

依赖者: 28

建议者: 2

安全性: 0

星星: 23

关注者: 13

分支: 15

开放性问题: 5

类型:silverstripe-vendormodule

3.0.4 2024-06-17 00:39 UTC

README

CI

此模块让开发者能够通过代码配置类似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表达式的解析工作。

此模块只是对他代码的一个薄封装。