kfosoft/yii2-queue-scheduler

扩展为yii2-queue库提供创建计划任务的函数

安装: 268

依赖: 0

建议者: 0

安全性: 0

星标: 0

关注者: 2

分支: 0

开放问题: 0

类型:yii2-extension

20.09 2020-09-30 15:52 UTC

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