ijvo / cronner
一个简单的工具,有助于cron任务的维护。
Requires
- php: >=7.1.0
- nette/application: ^3.0
- nette/bootstrap: ^3.0
- nette/di: ^3.0
- nette/safe-stream: ^2.4
- nette/utils: ^3.0 || ^4.0
- stekycz/critical-section: ^1.0
- tracy/tracy: ^2.6
Requires (Dev)
- jakub-onderka/php-parallel-lint: ^0.9
- mockery/mockery: ^1.0
- nette/tester: ^2.3
- phpstan/phpstan: ^0.12.0
Suggests
- kdyby/console: Symfony Console integration for Kdyby components
- kdyby/events: Events for Nette Framework
README
一个简单的工具,有助于cron任务的维护。(从 stekycz/Cronner 分支而来)
描述
Use brackets in Nette 3
/**
* @cronner-task(E-mail sending)
* @cronner-period(1 day)
*/
一个简单的工具,有助于cron任务的维护。
它需要 PHP >= 7.1.0 和 Nette 框架 >= 3.0.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() { // Code which sends all your e-mails } /** * @cronner-task(Important data replication) * @cronner-period(3 hours) */ public function replicateImportantData() { // Replication code } }
建议使用编译器扩展。
extension: cronner: stekycz\Cronner\DI\CronnerExtension cronner: timestampStorage: stekycz\Cronner\TimestampStorage\FileStorage(%wwwDir%/../temp/cronner) maxExecutionTime: 1800 criticalSectionTempDir: %wwwDir%/../temp/cronnerCritical criticalSectionDriver: null
它不需要任何配置,但是您自己的时间戳存储实现可能比默认存储更好。您的存储必须在 config.neon
中定义为服务,Cronner 将找到它。但是,如果服务不可自动注入,您还可以手动指定服务。
cronner: timestampStorage: @myCoolTimestampStorage
或者,您可以更改默认存储的目录。
cronner: timestampStorage: stekycz\Cronner\TimestampStorage\FileStorage(%wwwDir%/../temp/cronner)
还可以为Cronner定义 maxExecutionTime
,这样您就不必自己编写代码(以及可能的所有请求)。选项 criticalSectionTempDir
可以更改,但是目录必须对PHP进程可写。它用于在每次运行任务时只运行一次任务。
最后,您需要指定您的任务对象。这很可能是某个服务。您可以将标签 cronner.tasks
添加到所有带有Cronner任务的服务,这些服务将自动绑定。但是,您仍然可以使用 addTasks
方法添加新的任务对象。
然后您可以在 Presenter
中非常容易地使用它
class CronPresenter extends \Nette\Application\UI\Presenter { /** * @var \stekycz\Cronner\Cronner * @inject */ public $cronner; public function actionCron() { $this->cronner->run(); } }
或在 Kdyby/Console 的 Command
中使用它。
服务配置也是可能的,但 不应 在Nette的新版本中使用,因为建议使用扩展,这是推荐和首选的方式。然而,您仍然需要在您的 Presenter
或控制台 Command
中的某个地方调用 run
方法。
services: cronner: stekycz\Cronner\Cronner(stekycz\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()
函数接受的任何值。唯一的限制是带有“+”号前的时间不可用,因为它是Cronner自动添加的。因此,“这个月的第一天”不可接受,而“1个月”是可接受的。
注意: 此注解的值不应包含任何符号(+ 或 -)。
示例
/** * @cronner-period(1 day) */
@cronner-days
允许仅在指定的天运行任务。可能的值是星期名称的缩写。这意味着 Mon
、Tue
、Wed
、Thu
、Fri
、Sat
和 Sun
。有两个快捷方式可以更容易地使用:working days
(Mon
、Tue
、Wed
、Thu
、Fri
)和 weekend
(Sat
和 Sun
),它们在内部扩展到特定天数。多个值必须用逗号(Mon, Wed, Fri
)或范围(Mon-Thu
)分隔。
示例
/** * @cronner-days(working days, Sun) */
@cronner-time
指定任务可以运行的时间段(或多个时间段)。可以是时间段或具体的分钟。使用24小时制。多个值之间必须用逗号分隔。
时间可以跨越午夜,如下例所示。
注意:如果前一次运行由于任何原因启动较慢,则任务将在5秒的容差时间内尽可能快地运行。
示例
/** * @cronner-time(11:00, 23:30 - 05:00) */