webtoolsnz/yii2-scheduler

Yii2应用的任务调度运行器

安装次数: 54,830

依赖项: 0

建议者: 0

安全: 0

星标: 17

关注者: 14

分支: 14

开放问题: 4

类型:yii2-extension

0.1.19 2020-06-08 02:52 UTC

README

Software License Build Status Coverage Status Quality Score

yii2的任务调度管理器

安装

安装此扩展的首选方式是通过 composer.

使用以下命令进行安装。

$ composer require webtoolsnz/yii2-scheduler

现在包已安装,您需要在您的应用程序中配置模块

应更新 config/console.php 文件以反映以下更改

    'bootstrap' => ['log', 'scheduler'],
    'modules' => [
        'scheduler' => ['class' => 'webtoolsnz\scheduler\Module'],
    ],
    'components' => [
        'errorHandler' => [
            'class' => 'webtoolsnz\scheduler\ErrorHandler'
        ],
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\EmailTarget',
                    'mailer' =>'mailer',
                    'levels' => ['error', 'warning'],
                    'message' => [
                        'to' => ['admin@example.com'],
                        'from' => [$params['adminEmail']],
                        'subject' => 'Scheduler Error - ####SERVERNAME####'
                    ],
                    'except' => [
                    ],
                ],
            ],
        ],
    ]

同时,请将以下内容添加到您的 config/console.php 文件顶部

\yii\base\Event::on(
    \webtoolsnz\scheduler\console\SchedulerController::className(),
    \webtoolsnz\scheduler\events\SchedulerEvent::EVENT_AFTER_RUN,
    function ($event) {
        if (!$event->success) {
            foreach($event->exceptions as $exception) {
                throw $exception;
            }
        }
    }
);

要实现调度程序的GUI,请将以下内容添加到您的 config/web.php

    'bootstrap' => ['log', 'scheduler'],
    'modules' => [
        'scheduler' => ['class' => 'webtoolsnz\scheduler\Module'],
    ],

更新配置文件后,需要在项目根目录中创建一个 tasks 目录。

运行数据库迁移,这将为 scheduler 创建必要的表

php yii migrate up --migrationPath=vendor/webtoolsnz/yii2-scheduler/src/migrations

添加控制器

<?php

namespace app\modules\admin\controllers;

use yii\web\Controller;

/**
 * Class SchedulerController
 * @package app\modules\admin\controllers
 */
class SchedulerController extends Controller
{
    public function actions()
    {
        return [
            'index' => [
                'class' => 'webtoolsnz\scheduler\actions\IndexAction',
                'view' => '@scheduler/views/index',
            ],
            'update' => [
                'class' => 'webtoolsnz\scheduler\actions\UpdateAction',
                'view' => '@scheduler/views/update',
            ],
            'view-log' => [
                'class' => 'webtoolsnz\scheduler\actions\ViewLogAction',
                'view' => '@scheduler/views/view-log',
            ],
        ];
    }
}

示例任务

现在您可以使用调度程序创建第一个任务,在项目根目录中的 tasks 目录内创建文件 AlphabetTask.php

将以下代码粘贴到您的任务中

<?php
namespace app\tasks;

/**
 * Class AlphabetTask
 * @package app\tasks
 */
class AlphabetTask extends \webtoolsnz\scheduler\Task
{
    public $description = 'Prints the alphabet';
    public $schedule = '0 * * * *';
    public function run()
    {
        foreach (range('A', 'Z') as $letter) {
            echo $letter;
        }
    }
}

上面的代码定义了一个简单的任务,该任务在每个小时开始时运行,并打印出字母表。

此类中 $schedule 属性定义了任务将运行的频率,这些是简单的 Cron表达式

运行任务

调度程序提供了一个直观的CLI用于执行任务,以下是一些示例

 # list all tasks and their status
 $ php yii scheduler

 # run the task if due
 $ php yii scheduler/run --taskName=AlphabetTask

 # force the task to run regardless of schedule
 $ php yii scheduler/run --taskName=AlphabetTask --force

 # run all tasks
 $ php yii scheduler/run-all

 # force all tasks to run
 $ php yii scheduler/run-all --force

要自动运行任务,只需设置一个像这样的crontab即可

*/5 * * * * admin php /path/to/my/app/yii scheduler/run-all > /dev/null &

事件 & 错误

事件在运行单个任务之前以及全局级别为多个任务抛出

任务级别

Event::on(AlphabetTask::className(), AlphabetTask::EVENT_BEFORE_RUN, function ($event) {
    Yii::trace($event->task->className . ' is about to run');
});
Event::on(AlphabetTask::className(), AlphabetTask::EVENT_AFTER_RUN, function ($event) {
    Yii::trace($event->task->className . ' just ran '.($event->success ? 'successfully' : 'and failed'));
});

或在全局级别,向 /yii 抛出错误

$application->on(\webtoolsnz\scheduler\events\SchedulerEvent::EVENT_AFTER_RUN, function ($event) {
    if (!$event->success) {
        foreach($event->exceptions as $exception) {
            throw $exception;
        }
    }
});

您可以在任务级别抛出异常,但这将阻止进一步的任务运行。

许可协议

MIT许可证(MIT)。有关更多信息,请参阅 LICENSE