heartsentwined / zf2-cron
ZF2 定时任务模块
Requires
- php: >=5.3.3
- yalesov/arg-validator: 2.*
- yalesov/background-exec: 2.*
- yalesov/cron-expr-parser: 2.*
- yalesov/yaml: 2.*
- yalesov/zf2-doctrine: 2.*
- zendframework/zendframework: 2.*
Requires (Dev)
README
ZF2 定时任务模块
此模块充当一个中央定时任务运行器。它允许你在 ZF2 应用程序中注册定时任务;这些任务将被汇总并一起运行。这样,你只需在 crontab 中维护一个条目,同时在 ZF2 应用程序中维护所需的所有定时任务。
安装
{ "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 中维护一个条目
- 运行时注册定时任务 - 例如,你可以注册条件定时任务
- 定时任务标识符 - 允许以后修改定时任务
- 定时任务锁定 - 防止单个任务被多次执行
- 无响应脚本恢复 - 恢复长时间运行的定时任务并自动重新排队
- 日志记录 - 所有任务,无论是
success
、running
、missed
还是error
,都将被记录;对于error
和missed
定时任务,还将记录错误信息和堆栈跟踪。
配置
将 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()
中设置status
:pending
、success
、running
、missed
或error
之一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() ); }