heartsentwined/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 中维护一个条目
  • 运行时注册定时任务 - 例如,你可以注册条件定时任务
  • 定时任务标识符 - 允许以后修改定时任务
  • 定时任务锁定 - 防止单个任务被多次执行
  • 无响应脚本恢复 - 恢复长时间运行的定时任务并自动重新排队
  • 日志记录 - 所有任务,无论是 successrunningmissed 还是 error,都将被记录;对于 errormissed 定时任务,还将记录错误信息和堆栈跟踪。

配置

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

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

用法

添加定时任务

运行 Foo::runCron('bar', 'baz'),每 15 分钟一次,标识符为 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 january-june/2 mon-fri(0-5分钟之间每分钟,10-59分钟之间每5分钟;每小时;2-10日和15-25日之间每天;1月至6月每两个月;星期一至星期五)

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

$args(可选)是回调的参数。定时任务将通过call_user_func_array调用,因此$args[0]将是第一个参数,$args[1]是第二个,等等。

运行定时任务

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

建议:设置一个定时任务并通过CLI运行ZF2应用

$ php public/index.php cron

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

http://(zf2 app)/cron

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

检索日志;高级用例

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

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

示例:检索定时任务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()
  );
}