stevad/yii-cron-tasks

Yii 扩展,用于在您的应用程序中通过 crontab 调度执行控制台命令

安装数: 7,048

依赖: 0

建议者: 0

安全性: 0

星标: 2

关注者: 2

分支: 1

开放问题: 0

类型:yii-extension

v1.0.7 2017-08-23 13:12 UTC

This package is auto-updated.

Last update: 2024-09-15 22:59:28 UTC


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.AppCronTasksgetList 动作。以下是包含 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.