yalesov / 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
)定时任务日志的保留时间
用法
添加定时任务
每 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
:以下之一pending
、success
、running
、missed
或error
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() ); }