Yii::$app->queue->push到底如何使用?

1. Yii::$app->queue->push 是什么?

想象一下,你在一家咖啡店:

  • 你需要将每一笔订单(任务)放入“待处理队列”中,由后厨按照顺序处理。
  • 在 Yii2 中,Yii::$app->queue->push 就像是这个“放入队列”的操作,用于将任务推送到队列系统中,等待异步处理。
(1) 核心概念
  • 定义

    • Yii::$app->queue->push 是 Yii2 队列扩展中的一个方法,用于将任务推送到队列中。
    • 示例:
      Yii::$app->queue->push(new SendEmailJob([
          'email' => '[email protected]',
          'subject' => 'Test Email',
          'body' => 'This is a test email.',
      ]));
      
  • 功能

    • 将任务(如发送邮件、生成报表等)异步化处理。
    • 解耦任务的触发和执行,提高系统的响应速度。

2. 它一共包含哪些部分?

(1) 核心组成部分
  1. Yii::$app->queue

    • 这是 Yii2 应用程序中的队列组件实例。
    • 示例:
      'components' => [
          'queue' => [
              'class' => \yii\queue\db\Queue::class, // 使用数据库作为队列驱动
              'db' => 'db', // 数据库连接组件
              'tableName' => '{{%queue}}', // 队列表名
          ],
      ],
      
  2. push 方法

    • 将任务推送到队列中,等待后续处理。
    • 示例:
      Yii::$app->queue->push($job);
      
  3. 任务类(Job Class)

    • 任务类定义了具体的业务逻辑,通常实现 yii\queue\JobInterface 接口。
    • 示例:
      namespace app\jobs;
      
      use yii\base\BaseObject;
      use yii\queue\JobInterface;
      
      class SendEmailJob extends BaseObject implements JobInterface
      {
          public $email;
          public $subject;
          public $body;
      
          public function execute($queue)
          {
              // 模拟发送邮件
              \Yii::info("Sending email to {$this->email}", 'queue');
              // 这里可以调用邮件发送服务
          }
      }
      
  4. 队列处理器

    • 队列处理器负责从队列中取出任务并执行。
    • 示例:
      yii queue/run
      

3. 使用场景是什么?

(1) 异步任务处理
  • 场景:将耗时任务(如发送邮件、生成报表)放入队列中异步处理,避免阻塞主线程。
  • 示例:
    Yii::$app->queue->push(new SendEmailJob([
        'email' => '[email protected]',
        'subject' => 'Welcome!',
        'body' => 'Thank you for registering.',
    ]));
    
(2) 延迟任务
  • 场景:将任务延迟一段时间后再执行(如发送提醒邮件)。
  • 示例:
    Yii::$app->queue->delay(3600)->push(new SendReminderJob([
        'userId' => 123,
    ]));
    
(3) 批量任务
  • 场景:将多个任务批量推送到队列中,统一处理。
  • 示例:
    foreach ($emails as $email) {
        Yii::$app->queue->push(new SendEmailJob([
            'email' => $email,
            'subject' => 'Batch Email',
            'body' => 'This is a batch email.',
        ]));
    }
    
(4) 分布式任务
  • 场景:在分布式系统中,将任务分发到不同的服务器进行处理。
  • 示例:
    Yii::$app->queue->push(new GenerateReportJob([
        'reportId' => 456,
    ]));
    

4. 底层原理是什么?

(1) 队列存储机制
  • 队列驱动

    • Yii::$app->queue 支持多种队列驱动(如数据库、Redis、RabbitMQ 等)。
    • 示例:
      'class' => \yii\queue\redis\Queue::class, // 使用 Redis 作为队列驱动
      
  • 任务存储

    • 任务被序列化后存储到队列中(如数据库表或 Redis 列表)。
    • 示例:
      INSERT INTO queue (channel, job, push_time) VALUES ('default', 'serialized_job_data', NOW());
      
(2) 任务执行流程
  1. 推送任务

    • 调用 push 方法将任务推送到队列中。
    • 示例:
      Yii::$app->queue->push(new SendEmailJob([
          'email' => '[email protected]',
      ]));
      
  2. 任务存储

    • 任务被存储到队列中(如数据库表或 Redis 列表)。
    • 示例:
      Queue Table:
      +----+---------+---------------------+
      | id | channel | job                 |
      +----+---------+---------------------+
      | 1  | default | {"email":"..."}     |
      +----+---------+---------------------+
      
  3. 任务处理

    • 队列处理器从队列中取出任务并执行。
    • 示例:
      yii queue/run
      
  4. 任务完成

    • 任务完成后从队列中移除。
    • 示例:
      DELETE FROM queue WHERE id = 1;
      
(3) 并发与锁机制
  • 并发处理

    • 使用锁机制(如 MySQL 锁或 Redis 锁)确保任务不会被重复执行。
    • 示例:
      'mutex' => \yii\mutex\MysqlMutex::class,
      
  • 重试机制

    • 如果任务执行失败,队列会尝试重新执行任务。
    • 示例:
      'attempts' => 3, // 最大重试次数
      

5. 具体使用步骤

(1) 安装和配置队列扩展

确保你已经安装并配置了 Yii2 的队列扩展(如 yii2-queue)。如果尚未安装,可以通过 Composer 安装:

composer require yiisoft/yii2-queue

然后,在你的应用配置文件(如 config/main.phpconfig/console.php)中添加队列组件的配置:

'components' => [
    'queue' => [
        'class' => \yii\queue\db\Queue::class, // 使用数据库作为队列驱动
        'db' => 'db', // 数据库连接组件
        'tableName' => '{{%queue}}', // 队列表名
        'channel' => 'default', // 队列通道名称
        'mutex' => \yii\mutex\MysqlMutex::class, // 锁机制
    ],
],
(2) 创建队列任务类

创建一个队列任务类,定义任务的逻辑。例如,创建一个简单的任务类 SendEmailJob

namespace app\jobs;

use yii\base\BaseObject;
use yii\queue\JobInterface;

class SendEmailJob extends BaseObject implements JobInterface
{
    public $email;
    public $subject;
    public $body;

    public function execute($queue)
    {
        // 模拟发送邮件
        \Yii::info("Sending email to {$this->email}", 'queue');
        // 这里可以调用邮件发送服务
    }
}
(3) 推送任务到队列

在控制器或其他地方推送任务到队列。例如,在控制器中创建一个动作来推送任务:

namespace app\controllers;

use Yii;
use yii\web\Controller;
use app\jobs\SendEmailJob;

class SiteController extends Controller
{
    public function actionSendEmail()
    {
        $job = new SendEmailJob([
            'email' => '[email protected]',
            'subject' => 'Test Email',
            'body' => 'This is a test email.',
        ]);

        Yii::$app->queue->push($job);

        return 'Email job pushed to queue.';
    }
}
(4) 执行队列任务

运行队列处理命令,执行任务并查看日志。例如,使用以下命令运行队列处理器:

yii queue/listen

或者,如果你使用的是同步队列(如开发环境),可以直接运行:

yii queue/run

6. 总结

(1) 核心组成部分
  • Yii::$app->queue:队列组件实例。
  • push 方法:将任务推送到队列中。
  • 任务类:定义具体的业务逻辑。
  • 队列处理器:执行队列中的任务。
(2) 使用场景
  • 异步任务处理。
  • 延迟任务。
  • 批量任务。
  • 分布式任务。
(3) 底层原理
  • 队列存储:任务被序列化后存储到队列中。
  • 任务执行:队列处理器从队列中取出任务并执行。
  • 并发与锁:确保任务不会被重复执行。
  • 重试机制:支持任务失败后的重试。

你可能感兴趣的:(Yii2.0,android)