panix / mod-scheduler
调度模块
dev-main
2024-08-25 16:17 UTC
Requires
- mtdowling/cron-expression: ~1.0
- yiisoft/yii2: ^2.0.9
This package is auto-updated.
Last update: 2024-09-25 16:34:48 UTC
README
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。