Yii框架的后台作业管理器

dev-master 2014-12-15 16:00 UTC

This package is not auto-updated.

Last update: 2024-09-24 02:52:34 UTC


README

Build Status Scrutinizer Code Quality Code Coverage Code Climate

Yiiq 是一个强大的基于 Redis 的多线程后台作业管理器,专为 Yii 框架设计,注重稳定性和简洁性。

要运行一个作业,只需将其包裹在类中并输入

Yii::app()->yiiq->enqueue('\MyJob');

这就完成了!

目录

特性

  • 稳定性
    如果作业崩溃,守护进程将保持运行。如果服务器崩溃,守护进程将恢复其状态,包括所有未完成的作业。
  • 多线程
    您可以运行您需要的任何数量的进程。
  • 排队
    作业可以分组在不同的队列中,由不同的进程处理。
  • 清晰性
    您可以在任何时间点跟踪您的作业状态。
  • 计划
    作业可以在特定时间或立即执行。一次或多次。
  • 反馈
    作业可以将结果返回到扩展。

要求

  • Unix平台
  • PHP >= 5.4
  • Redis
  • pcntl扩展
  • Yii框架 >= 1.1.14
  • YiiRedis

安装

以下步骤假设您有默认的 Yii 应用程序布局,其中包含两个配置文件:分别为 Web 和控制台应用程序的 main.phpconsole.phpYiiq 也由两部分组成:框架扩展和守护进程。扩展负责排队作业,守护进程负责执行它们。由于守护进程作为控制台应用程序运行,它将使用 console.php 配置文件,而扩展将根据所使用的应用程序类型使用两个文件。因此请注意,YiiqYiiRedis 扩展必须包含在这两个文件中。

首先,通过 Composer 安装 Yiiq

composer require herroffizier/yiiq:dev-master

在此阶段,请确保 vendor/autoload.php 包含在这两个配置文件中。

现在我们需要设置扩展。将其添加到您的 components 数组中(也必须在两个文件中添加)

'components' => array(

    // ...

    'yiiq' => array(
        'class' => '\Yiiq\Yiiq',
        // Name to identify daemon in process list (optional)
        'name' => 'Yiiq test instance',
    ),

    // ...

),

请注意,YiiRedis 扩展也必须在两个文件中加载!

最后,将以下命令添加到 console.php 中的 commandMap

'commandMap' => array(

    // ...

    // Control Yiiq command
    'yiiq' => array(
        'class' => '\Yiiq\commands\Main',
    ),
        
    // Daemon Yiiq command
    'yiiqWorker' => array(
        'class' => '\Yiiq\commands\Worker',
    ),

    // ...

),

现在,是时候运行守护进程了。请记住,守护进程负责执行作业,因此它必须始终运行。在您的应用程序的 protected 文件夹中输入以下命令。

./yiic yiiq start --log=yiiq.log

log 参数是可选的,但强烈建议在第一次运行时至少使用它。

运行 ./yiic yiiq status 以检查守护进程是否正确启动。您应该看到类似以下的内容

All processes (28235) are alive. Everything looks good.

如果守护进程没有运行,请参考 application.logyiiq.log(两者都存储在 runtime 文件夹中)以获取详细信息。

使用

创建作业

要创建一个作业,您应该扩展 \Yiiq\jobs\Payload 类并实现其 run() 方法

class YiiqDummyJob extends \Yiiq\jobs\Payload
{
    /**
     * Time to wait before exit.
     *
     * @var integer
     */
    public $sleep = 10;

    /**
     * This method should contain all the job logic.
     *
     * @return {mixed} all returned data will be saved in Redis 
     *                 (for non-repeatable jobs)
     */
    public function run()
    {
        Yii::trace(
            'Started dummy job '.$this->queue.':'.$this->id
            .' (sleep for '.$this->sleep.'s).'
        );
        sleep($this->sleep);
        Yii::trace('Job '.$this->queue.':'.$this->id.' completed.');
    }

}

实际上,在 Yiiq 中有三种类型的作业:简单、计划和可重复。第一种立即执行,第二种在指定时间执行,第三种根据指定的间隔无限执行。

简单作业

要添加一个简单作业,您可以使用以下任一调用。如您所知,此作业将尽快执行一次。

// Add YiiqDummyJob with default arguments to default queue.

// Via arguments:
$job = Yii::app()->yiiq->enqueue('\YiiqDummyJob');

// Via method chaining:
$job = Yii::app()->yiiq->
    create('\YiiqDummyJob')->
    enqueue();

// Add YiiqDummyJob with customized arguments to default queue.

// Via arguments:
$job = Yii::app()->yiiq->enqueue(
    '\YiiqDummyJob', 
    ['sleep' => 5]
);

// Via method chaining:
$job = Yii::app()->yiiq->
    create('\YiiqDummyJob')->
    withArgs(['sleep' => 5])->
    enqueue();

// Add YiiqDummyJob with customized arguments to 'custom' queue.

// Via arguments:
$job = Yii::app()->yiiq->enqueue(
    '\YiiqDummyJob', 
    ['sleep' => 5], 
    'custom'
);

// Via method chaining:
$job = Yii::app()->yiiq->
    create('\YiiqDummyJob')->
    into('custom')->
    withArgs(['sleep' => 5])->
    enqueue();

计划作业

要安排在特定时间执行作业,您必须指定时间或间隔

// Run job at certain time.

// Via arguments:
$job = Yii::app()->yiiq->enqueueAt(
    time() + 60, 
    'YiiqDummyJob'
);

// Via method chaining:
$job = Yii::app()->yiiq->
    create('\YiiqDummyJob')->
    runAt(time() + 60)->
    enqueue();

// Run job after 60 seconds. In fact exactly the same as above.

// Via arguments:
$job = Yii::app()->yiiq->enqueueAfter(
    60, 
    '\YiiqDummyJob'
);

// Via method chaining:
$job = Yii::app()->yiiq->
    create('\YiiqDummyJob')->
    runAt(time() + 60)->
    enqueue();

可重复作业

要创建一个可重复作业,您可以使用以下代码

// Run job each 300 seconds.

// Via arguments:
$job = Yii::app()->yiiq->enqueueEach(
    300, 
    '\YiiqDummyJob'
);

// Via method chaining:
$job = Yii::app()->yiiq->
    create('\YiiqDummyJob')->
    runEach(300)->
    enqueue();

请注意,可重复作业不能将任何数据返回到 Yiiq