yalesov/zf2-cron

ZF2 定时任务模块

v3.2.3 2016-07-06 12:26 UTC

README

Build Status

ZF2 定时任务模块

此模块作为中央定时任务运行器。它允许您在 ZF2 应用程序中注册定时任务;这些任务将被汇总并一起运行。这允许您在 crontab 中只维护一个条目,同时在 ZF2 应用程序中维护所需的任何数量的定时任务。

安装

Composer:

{
  "require": {
    "yalesov/zf2-cron": "3.*"
  }
}

然后将 Yalesov\Cron 添加到 (app root)/config/application.config.* 中的 modules 键。

定时任务模块也将通过 DoctrineORMModule 与您的应用程序数据库挂钩。它将创建一个名为 he_cron_job 的单个表,并使用默认的实体管理器 doctrine.entitymanager.orm_default。如果您的设置不同,请根据需要修改 config/module.config.yml 中的 doctrine 部分,以及 Yalesov\Cron\Controller\CronController 中的 doctrine.entitymanager.orm_default 实例。

最后,您需要更新您的数据库模式。推荐的方法是通过 Doctrine 的 CLI。

$ vendor/bin/doctrine-module orm:schema-tool:update --force

功能

  • 所有标准定时任务功能(在 PHP 中)
  • 扩展定时表达式以支持更复杂的使用场景
  • 集中的定时任务入口/运行器 - 您只需在 crontab 中维护一个条目
  • 运行时注册定时任务 - 您可以注册条件性的定时任务,例如
  • 定时任务标识符 - 允许稍后修改定时任务
  • 定时任务锁定 - 防止单个任务被多次执行
  • 无响应脚本恢复 - 恢复长时间运行的定时任务并将它们自动重新排队
  • 日志记录 - 所有任务,无论 successrunningmissederror,都将被记录;对于 errormissed 定时任务,还会记录错误信息和堆栈跟踪。

配置

config/cron.local.php.dist 复制到 (app root)/config/autoload/cron.local.php,并修改设置。

  • scheduleAhead:定时任务的计划时间。在任务可以运行之前,必须将定时任务计划为单独的任务,以便跟踪单个定时任务的锁定、日志和从单个长时间运行的脚本中恢复。
  • scheduleLifetime:在认为计划中的任务被遗漏之前的时间。如果任务被计划,但未运行(例如,crontab 条目被删除),并且超过 scheduleLifetime,则将其无效化并标记为 missed
  • maxRunningTime:每个定时任务的最大运行时间。如果任务的运行时间超过 maxRunningTime,则将其恢复并重新排队以重新运行。
  • successLogLifetime:成功完成的定时任务日志的保留时间
  • failureLogLifetime:失败(missed / error)定时任务日志的保留时间

用法

添加定时任务

每 15 分钟运行 Foo::runCron('bar', 'baz'),标识符为 foo

use Yalesov\Cron\Service\Cron;
Cron::register(
  'foo',
  '*/15 * * * *',
  'Foo::runCron',
  array('bar', 'baz')
);

函数签名

public static function register($code, $frequency, $callback, array $args = array())

$code 是任务的唯一标识符。它允许稍后覆盖任务、通过标识符检索任务、过滤等。

$frequency 是任何有效的定时表达式,同时支持

  • 范围:0-5
  • 范围 + 间隔:10-59/5
  • 这些范围的逗号分隔组合:1,4,7,10-20
  • 英文月份:january
  • 英文月份(缩写为三个字母):jan
  • 英文星期:monday
  • 英文星期(缩写为三个字母):mon
  • 这些文本等价物可以在允许其数值等价物的所有地方使用,例如 jan-jun/2
  • 一个完整示例:0-5,10-59/5 * 2-10,15-25 一月-六月/2 星期一-星期五(0-5分钟之间的每分钟 + 10-59分钟之间的每5分钟;每小时;2-10天和15-25天之间的每天;1月-6月之间的每隔两个月;星期一至星期五)

$callback 是任何有效的PHP回调函数。

$args(可选)是回调函数的参数。Cron任务将通过 call_user_func_array 调用,因此 $args[0] 将是第一个参数,$args[1] 是第二个,依此类推。

运行Cron任务

为了实际运行Cron任务,您需要设置一个(真实的)Cron任务来触发Cron模块。然后它将按照指定的频率运行您已注册的Cron任务,并按照指定的方式重试和记录。

建议:设置Cron任务并通过CLI运行ZF2应用程序

$ php public/index.php cron

后备方案:如果上述方法不起作用,您始终可以通过浏览器(或通过lynx、wget等)运行它

http://(zf2 app)/cron

安全性:这将不会将您的Cron数据或错误输出暴露给任何最终用户。控制器将立即关闭连接,发送空响应,并继续作为后台运行Cron任务。

检索日志;高级用法

您可以通过Doctrine 2 ORM API与单个Cron任务交互。Cron模块仅定义了一个实体 Yalesov\Cron\Entity\Job

  • id:单个Cron任务的唯一标识符
  • code:Cron任务“批量/家族”标识符,如Cron::register()中设置
  • status:以下之一pendingsuccessrunningmissederror
  • errorMsg:存储error Cron任务的错误消息
  • stackTrace:存储error Cron任务的堆栈跟踪
  • createTime:(日期时间)此单个作业创建的时间
  • scheduleTime:(日期时间)此单个作业计划运行的时间
  • executeTime:(日期时间)此作业运行的时间(执行开始时)
  • finishTime:(日期时间)此作业终止的时间。对于除success之外的任务,将始终为null

示例:检索Cron任务 foo 的所有错误消息

// $em instance of EntityManager
$errorJobs = $em->getRepository('Yalesov\Cron\Entity\Job')->findBy(array(
  'code'   => 'foo',
  'status' => \Yalesov\Cron\Repository\Job::STATUS_ERROR,
));
foreach ($errorJobs as $job) {
  echo sprintf(
    "cron job, code %s, executed at %s with error \n %s \n\n",
    $job->getCode(), // will always be 'foo' in this example
    $job->getExecuteTime()->format('r'),
    $job->getErrorMsg()
  );
}