queencitycodefactory/cakephp-scheduler

让在CakePHP中安排任务变得非常简单。

安装: 5

依赖项: 0

建议者: 0

安全性: 0

星星: 0

监视者: 2

分支: 17

类型:cakephp-plugin

3.0.4 2016-01-09 20:50 UTC

This package is auto-updated.

Last update: 2024-09-06 00:03:13 UTC


README

让在CakePHP中安排任务变得非常简单。

作者

Trent Richardson [http://trentrichardson.com]

许可证

版权 2015 Trent Richardson

您可以在MIT许可证下使用此项目。 http://trentrichardson.com/Impromptu/MIT-LICENSE.txt

工作原理

SchedulerShell通过为项目安排一个cron(SchedulerShell)来工作。然后在bootstrap.php中,您可以为您所有的任务创建时间间隔。部署新的计划任务现在变得更加容易;一个crontab条目执行所有任务。

安装

此Shell是为CakePHP 3开发的。

Composer安装(推荐)

在项目的composer.json文件中,将此添加到您的require部分

"trentrichardson/cakephp-scheduler": "~3.0"

手动安装

将Scheduler插件复制到您的App/Plugin文件夹,并将文件夹重命名为Scheduler。

加载插件

在您的bootstrap.php文件中添加以下内容之一:

Plugin::loadAll();

Plugin::load('Scheduler',['autoload'=>true]);

通过最短的时间间隔安排单个系统cron,以运行SchedulerShell.php。例如,如果您有5个任务,最常运行的间隔是每5分钟,那么请将此cron安排为至少每5分钟运行一次。有关更多信息,请参阅Shells as Cron Jobs

示例cron作业

*/5 * * * * cd /path/to/app && bin/cake Scheduler.Scheduler

这将每5分钟运行一次SchedulerShell。

现在一旦安排了这个shell,我们就能将条目添加到bootstrap.php中。假设我们想要每天凌晨5点安排一个CleanUp任务,每15分钟安排一个NewsletterTask。

Configure::write('SchedulerShell.jobs', [
	'CleanUp' => ['interval' => 'next day 5:00', 'task' => 'CleanUp'],// tomorrow at 5am
	'Newsletters' => ['interval' => 'PT15M', 'task' => 'Newsletter'] //every 15 minutes
]);

每个条目的密钥将用于存储上一次运行的记录。 这些必须是唯一的

interval可以以两种方式设置。

  1. 对于一天中的特定时间,我们使用PHP的相对时间格式:“下一天 5:00”。

  2. 要使用间隔来实现“每15分钟”,我们使用DateInterval字符串格式:“PT15M”。

task只是Task的名称。

您还可以传递一些可选参数:“action”和“pass”。

action默认为“execute”,这是您指定的任务中要调用的方法名称。

pass默认为[],这是传递给您的“action”的参数数组。

Configure::write('SchedulerShell.jobs', [
	'CleanUp' => ['interval' => 'next day 5:00', 'task' => 'CleanUp', 'action' => 'execute', 'pass' => [] ],
	'Newsletters' => ['interval' => 'PT15M', 'task' => 'Newsletter', 'action' => 'execute', 'pass' => [] ]
));

结果存储

SchedulerShell在json文件中跟踪每次运行。默认情况下,它存储在TMP中,名称为“cron_scheduler.json”。

如果您需要更改这些,可以使用

// change the file name
Configure::write('SchedulerShell.storeFile', "scheduler_results.json");
// change the path (note the ending /)
Configure::write('SchedulerShell.storePath', "/path/to/save/");

防止同时运行相同的任务的SchedulerShells

默认情况下,如果SchedulerShell已运行不到10分钟,则将退出。您可以通过设置来调整此设置

// change the number of seconds to wait before running a parallel SchedulerShell; 0 = do not exit
Configure::write('SchedulerShell.processTimeout', 5*60);

这是通过在进程运行时创建一个标志文件,并在完成后删除该文件来实现的。如果文件存在,但比指定的超时时间旧,则调度程序将继续。尽管您不需要,但您可以更改此文件的名称

// change the name of the processing flag file
Configure::write('SchedulerShell.processingFlagFile', '.cron_scheduler_processing_flag');

其他说明/已知问题

  • 可选的pass参数尚未经过彻底测试
  • PHP 5.3.6之前的版本仅使用相对日期时间用于DateTime::modify()函数。如果上一个lastRun时间是在05:02,则可能导致“下一天 5:00”的间隔没有运行。因此,此插件应仅在PHP >= 5.3.6上运行。

贡献

非常感谢您的贡献。在您花太多时间在修复问题之前,请检查已发布的议题、拉取请求和分支,看看是否有人已经解决了该问题。

在做出更改时,请记住master分支总是最新的稳定版本。我不会直接在此分支上应用更改,而是将其应用于cakephp-v*分支。当最新版本的cakephp分支稳定后,我会给它打上标签并将其合并到master分支。

快速概览

  • 为要应用更改的cake版本,Fork/Checkout cakephp-v*分支
  • 从终端中cd进入目录并运行composer install
  • 编写您想要进行的任何测试和更改
  • 运行vendor/bin/phpunit以验证所有测试通过并且您的代码能够正常工作
  • 提交、推送并向cakephp-v*分支发送拉取请求