bileto/cronner

一个简单的工具,帮助维护cron任务。

维护者

详细信息

github.com/bileto/cronner

源代码

问题

安装数: 1,029

依赖者: 0

建议者: 0

安全性: 0

星星: 75

观察者: 11

分支: 17

公开问题: 8

类型:nette-addon

v3.0.0 2021-12-25 11:57 UTC

README

描述

一个简单的工具,帮助维护cron任务。

它需要 PHP >= 8.0Nette Framework >= 3.0

使用方法

由于其配置仅存在于方法注解中,因此使用它非常简单。以下是一个带有任务的示例类。

class CronTasks
{
    /**
     * @cronner-task E-mail sending
     * @cronner-period 1 day
     * @cronner-days working days
     * @cronner-time 23:30 - 05:00
     */
    public function sendEmails(): void
    {
        // Code which sends all your e-mails
    }


    /**
     * @cronner-task Important data replication
     * @cronner-period 3 hours
     */
    public function replicateImportantData(): void
    {
        // Replication code
    }
}

建议使用编译器扩展。

extension:
    cronner: Bileto\Cronner\DI\CronnerExtension

它不需要任何配置,但您的自定义时间戳存储可能比默认存储更好。您必须在 config.neon 中将存储定义为一个服务,Cronner 将找到它。但是,如果服务不可自动注入,您可以手动指定服务。

cronner:
    timestampStorage: myCoolTimestampStorage

或者,您可以更改默认存储的目录。

cronner:
    timestampStorage: Bileto\Cronner\TimestampStorage\FileStorage(%wwwDir%/../temp/cronner)

您还可以为Cronner定义 maxExecutionTime,这样您就不必亲自编写代码(并且可能对您的所有请求都这样做)。选项 criticalSectionTempDir 可以更改,但是目录必须对php进程可写。它用于每次只运行每个任务一次。

最后,您需要指定您的任务对象。这可能是某个服务,可能性很高。您可以将 cronner.tasks 标签添加到所有具有Cronner任务的服务的上,这些服务将自动绑定。但是,您仍然可以使用 addTasks 方法添加新的任务对象。

然后,您可以在 Presenter 中非常容易地使用它

class CronPresenter extends \Nette\Application\UI\Presenter
{
    /**
     * @var \Bileto\Cronner\Cronner
     * @inject
     */
    public $cronner;

    
    public function actionCron(): void
    {
        $this->cronner->run();
    }
}

或从 Kdyby/ConsoleCommand 中使用它。

服务配置也是可能的,但 不应 使用Nette的新版本,因为推荐和首选的方式是使用扩展。然而,您仍然需要在您的 Presenter 或控制台 Command 中的某个地方调用 run 方法。

services:
    cronner: Bileto\Cronner\Cronner(Bileto\Cronner\TimestampStorage\FileStorage(%wwwDir%/../temp/cronner))
    setup:
    	- addTasks(new CronTasks())

注解

@cronner-task

此注解对于所有应作为任务使用的公共方法 是必需的。其值用作任务的名称。如果值不存在,则名称由类名和方法名构建。

如果此注解在任务方法注释中是单个(对于Cronner),则任务在Cronner每次运行时都会运行。

注意:不能将魔术方法用作任务(__construct__sleep 等)。

示例

/**
 * @cronner-task Fetches all public data from all registered social networks
 */

@cronner-period

这不是必需的,但建议的注解,用于指定任务执行的周期。周期是两次执行任务之间的最小时间。它的值可以是 strtotime() 函数可接受的一切。唯一的限制是与时间之前的 "+" 符号的可用性,因为它是自动添加的。所以 这个月的第一天 不可接受,但是 1个月 是可接受的。

注意:此注解的值不应包含任何符号(+ 或 -)。

示例

/**
 * @cronner-period 1 day
 */

@cronner-days

仅允许在指定的日子运行任务。可能的值是星期几的简称。即表示 Mon(周一)、Tue(周二)、Wed(周三)、Thu(周四)、Fri(周五)、Sat(周六)和 Sun(周日)。有两个快捷方式方便使用:working days(周一至周五)和 weekend(周六和周日),它们在内部展开为具体的日期。多个值必须用逗号(Mon, Wed, Fri)分隔,或者可以指定范围 Mon-Thu

示例

/**
 * @cronner-days working days, Sun
 */

@cronner-time

指定任务可以运行的时间范围(或多个时间范围)。它可以是一个范围或一个具体的分钟数。它使用24小时制。多个值必须用逗号分隔。

时间可以定义为午夜,如下例所示。

注意:如果前一次运行由于任何原因启动较慢,则任务运行有5秒的容差时间,以确保尽可能快地运行。

示例

/**
 * @cronner-time 11:00, 23:30 - 05:00
 */