panix/mod-scheduler

调度模块

安装: 2

依赖: 0

建议者: 0

安全性: 0

星标: 0

关注者: 1

分支: 0

开放问题: 0

类型:pixelion-module

dev-main 2024-08-25 16:17 UTC

This package is auto-updated.

Last update: 2024-09-25 16:34:48 UTC


README

Latest Stable Version Total Downloads Monthly Downloads Daily Downloads Latest Unstable Version License

yii2的调度任务管理器

安装

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

使用以下命令安装。

$ composer require panix/mod-scheduler

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

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

    'bootstrap' => ['log', 'scheduler'],
    'modules' => [
        'scheduler' => ['class' => 'panix\mod\scheduler\Module'],
    ],
    'components' => [
        'errorHandler' => [
            'class' => 'panix\mod\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(
    \panix\mod\scheduler\console\SchedulerController::className(),
    \panix\mod\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' => 'panix\mod\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' => 'panix\mod\scheduler\actions\IndexAction',
                'view' => '@scheduler/views/index',
            ],
            'update' => [
                'class' => 'panix\mod\scheduler\actions\UpdateAction',
                'view' => '@scheduler/views/update',
            ],
            'view-log' => [
                'class' => 'panix\mod\scheduler\actions\ViewLogAction',
                'view' => '@scheduler/views/view-log',
            ],
        ];
    }
}

示例任务

现在您可以使用调度器创建第一个任务,在项目根目录下的tasks目录中创建一个名为AlphabetTask.php的文件。

将以下代码粘贴到任务中

<?php
namespace app\tasks;

/**
 * Class AlphabetTask
 * @package app\tasks
 */
class AlphabetTask extends \panix\mod\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(\panix\mod\scheduler\events\SchedulerEvent::EVENT_AFTER_RUN, function ($event) {
    if (!$event->success) {
        foreach($event->exceptions as $exception) {
            throw $exception;
        }
    }
});

您可以在任务级别抛出异常,但这将阻止其他任务运行。

许可证

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