stevad / yii-cron-tasks
Yii 扩展,用于在您的应用程序中通过 crontab 调度执行控制台命令
Requires
- php: >=5.3.0
- yiisoft/yii: >=1.1.16
README
这是一个简单的扩展,用于在 Yii Framework 1.x 应用程序中创建和执行计划中的控制台命令。
它允许使用强大的 crontab 语法创建任务。每个任务都可以是唯一的,以防止重叠(如果发生这种情况,将记录警告消息)。此外,您可以为每个任务设置输出文件,并获取有关最后启动和停止时间以及当前执行状态(包括 PID)的信息。
有关许可信息,请查看 LICENSE 文件。
在 Yii Framework v1.1.16+ 上进行了测试。
安装
此扩展可在 packagist.org 上找到,可以通过以下命令使用 composer 安装:
composer require --dev stevad/yii-cron-tasks
.
如果您想手动安装此扩展,请将源代码复制到 /protected/extensions
目录。
默认配置示例(使用 ext.yii-cron-tasks
别名,意味着扩展文件位于此处:/protected/extensions/yii-cron-tasks
)
return array( // import classes 'import' => array( 'ext.yii-cron-tasks.*' ), 'components' => array( 'cron' => array( 'class' => 'ext.yii-cron-tasks.CronService', // next option must be a valid PHP callback, this is example 'tasksCallback' => array( array('class' => 'application.models.AppCronTasks'), 'getList' ), ), ), 'commandMap' => array( 'cron' => array( 'class' => 'ext.yii-cron-tasks.CronCommand', 'enabled' => true // you can use this flag to quickly disable cron CLI commands if required ), ), );
对于组件选项 tasksCallback
,您必须指定有效的 PHP 回调。第一个参数可以是一个数组,包含对象定义,用于通过 Yii::createComponent()
方法创建实例。
在配置示例中提到了具有 Yii 类定义的回调 application.models.AppCronTasks
和 getList
动作。以下是包含 crontab 任务定义的类内容示例
文件: protected/models/AppCronTasks.php
class AppCronTasks { public function getList() { $tasks = array(); // call console command 'mail' with action 'sendInvites' every hour each 2 minutes starting from 9th // and save output to protected/runtime/console-mail-invites.txt $task1 = new CronTask('mail', 'sendInvites'); $tasks[] = $task1 ->name('Send invites via mail') ->minute('9/2') ->setOutputFile(Yii::app()->getRuntimePath() . '/console-mail-invites.txt'); // call console command 'import' with action 'products' every day at 00:00 and save output $task2 = new CronTask('import', 'products', array('removeOld' => 1)); $tasks[] = $task2 ->name('Import products (daily)') ->daily() ->setOutputFile(Yii::app()->getRuntimePath() . '/product-import.txt'); return $tasks; } }
在这个类中,我们有一个返回两个配置了控制台任务的方法。要运行它们,我们需要进行最后一步:手动将特殊控制台命令添加到服务器的 crontab 中
* * * * * php /path/to/yiic cron daemon >> /dev/null 2>&1
现在服务器将每分钟运行我们的自己的 cron daemon 控制台命令,并检查是否有指定的任务需要执行。
CronTask 类
默认情况下,每个任务实例都预先配置为每分钟执行一次(cron 调度:* * * * *
)。要创建自己的任务,您需要创建 CronTask
实例,并传递命令、操作名称和可选的参数。
命令是应用程序中可用的控制台命令的名称。操作名称可以省略(将运行默认操作:index
或根据配置选项指定的其他操作)。
参数表示为键值列表,其中键是参数的名称(不带开头的前缀 --
)。
CronTask
类中可用的方法
name('Task name')
- 为任务设置名称(用于日志和任务状态)unique()
- 将任务设置为不允许运行与先前运行的同名任务的其他实例setOutputFile('/full/path/to/file.txt')
- 设置将控制台输出重定向到的文件canRun()
- 检查任务现在是否可以执行getProcessInfo()
- 创建包含详细进程信息的CronProcess
实例(最后启动和停止时间,PID,执行状态)
控制调度的方法
hour(12)
- 设置 cron 调度的时部分minute('*/5')
- 设置 cron 调度的分部分(在示例中:每五分钟,从 0 开始)day('1-10,15/2')
- 设置cron作业的月份部分(例如:1-10号,然后从15号开始每个月的每隔2天,直到月底)month('4')
- 设置cron作业的月份部分(例如:每年4月)dayOfWeek('6')
- 设置cron作业的星期部分(例如:每个星期六)cron('30 12 * * *')
- 直接通过cron设置作业
每个方法都支持cron语法的所有功能。更多信息请访问此网站: crontab.guru
此外,还有一些可用的预定义“宏”方法
hourly()
- 每小时的开始运行任务,等同于cron:0 * * * *
daily()
- 每天在00:00运行任务,等同于cron:0 0 * * *
monthly()
- 每月1号00:00运行任务,等同于cron:0 0 1 * *
yearly()
- 每年1月1号00:00运行任务,等同于cron:0 0 1 1 *
weekly()
- 每个星期天00:00运行任务,等同于cron:0 0 * * 0
您可以以任何方式组合这些方法。例如,要设置每天18:00执行的任务,可以使用以下代码
$task = new CronTask('command/action'); $task->daily()->hour(18);
作者
版权所有(c)2017,Stevad.