queencitycodefactory / cakephp-scheduler
让在CakePHP中安排任务变得非常简单。
Requires
- php: >=5.3.6
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可以以两种方式设置。
-
对于一天中的特定时间,我们使用PHP的相对时间格式:“下一天 5:00”。
-
要使用间隔来实现“每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*分支发送拉取请求