kfosoft / yii2-queue-scheduler
扩展为yii2-queue库提供创建计划任务的函数
20.09
2020-09-30 15:52 UTC
Requires
- php: >=7.2
- ext-json: *
- kfosoft/yii2-daemon: 20.09
- ramsey/uuid: ^4.0
- yiisoft/yii2: >=2.0.34
This package is auto-updated.
Last update: 2024-08-29 05:24:57 UTC
README
Yii2 Queue Scheduler
为 yiisoft/yii2-queue
库提供的 Yii2 扩展
安装
composer require kfosoft/yii2-queue-scheduler
配置
对于(web, console)配置
'components' => [
kfosoft\queue\components\QueueScheduler::COMPONENT_NAME => [
'class' => kfosoft\queue\components\QueueScheduler::class,
'modelClassName' => 'default', // you can change model class name for don't use SchedulerQueueModel. But this class has to be implement the SchedulerQueueModelInterface
'tableName' => kfosoft\queue\models\SchedulerQueueModel::tableName(), // you can change name of database table without change SchedulerQueueModel
'queueComponentName' => 'queue', // name of queue component yiisoft/yii2-queue
'db' => 'db', // name of database component
'daemonSleepTime' => 10, // this timeout defines time between reading of SchedulerQueue database
],
...
],
...
对于控制台配置
'bootstrap' => ['queue', kfosoft\queue\components\QueueScheduler::COMPONENT_NAME, ...],
...
并迁移存储库中的迁移
来运行守护进程
bin/yii queue-scheduler
注意:为了使其正常工作,您必须选择以下选项之一
supervisor
请查看存储库中的supervisor配置cron
使用 WatcherDaemon(未测试)。
namespace console\controllers;
use kfosoft\daemon\WatcherDaemon;
class WatcherDaemonController extends WatcherDaemon
{
/**
* @return array
*/
protected function defineJobs()
{
sleep($this->sleep);
//TODO: modify list, or get it from config, it does not matter
$daemons = [
['className' => \kfosoft\queue\commands\SchedulerDaemonController::class, 'enabled' => true],
];
return $daemons;
}
}
然后添加此行到 crontab
* * * * * /path/to/yii/project/yii watcher-daemon --demonize=1
使用
- 为了使用调度器,您必须创建作业并实现
ScheduledJobInterface
。同时,您还必须在作业类中实现getJobParams
方法。它必须返回用于创建作业的字段值数组。例如
<?php
namespace app\jobs;
use kfosoft\queue\ScheduledJobInterface;
use Yii;
use yii\base\BaseObject;
use yii\base\InvalidConfigException;
class ImpotantJob extends BaseObject implements ScheduledJobInterface
{
/**
* @var int
*/
public $param1;
/**
* @var string
*/
public $param2;
/**
* {@inheritdoc}
* @throws InvalidConfigException
*/
public function execute($queue): void
{
// Your very important logic
}
/**
* {@inheritdoc}
*/
public function getJobParams(): array
{
return [
'param1' => $this->param1,
'param2' => $this->param2
];
}
}
- 您可以在5分钟或第二天早上7点调度一个作业。
// In 5 min
$dateTime = (new \DateTime())->modify('+5 minutes');
$job = new \app\jobs\ImpotantJob(['param1' => 1, 'param2' => 'Very important text']);
Yii::$app->get(\kfosoft\queue\components\QueueScheduler::COMPONENT_NAME)
->enqueueAt($job, $dateTime->getTimestamp());
// Next day at 7AM
$dateTime = (new \DateTime())->modify('+1 day')->setTime(7,0,0);
$job = new \app\jobs\ImpotantJob(['param1' => 1, 'param2' => 'Very important text']);
Yii::$app->get(\kfosoft\queue\components\QueueScheduler::COMPONENT_NAME)
->enqueueAt($job, $dateTime->getTimestamp());
注意:所有作业都在UTC时区运行。请将 enqueueAt
方法的时间戳(第二个参数)设置为服务器时区,因为组件会自动将时区转换为UTC。
- 如果需要,您可以检查计划中的作业。
$job = new \app\jobs\ImpotantJob(['param1' => 1, 'param2' => 'Very important text']);
$hasJob = Yii::$app->get(\kfosoft\queue\components\QueueScheduler::COMPONENT_NAME)
->hasDelayed($job); // bool returns
- 您还可以根据需要删除计划中的作业。
$job = new \app\jobs\ImpotantJob(['param1' => 1, 'param2' => 'Very important text']);
Yii::$app->get(\kfosoft\queue\components\QueueScheduler::COMPONENT_NAME)
->removeDelayed($job);
- 您还可以获取当前时刻的计划作业。
Yii::$app->get(\kfosoft\queue\components\QueueScheduler::COMPONENT_NAME)
->getJobsForNow(); // returns array jobs