欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

yii-queue搭配redis的使用

程序员文章站 2024-03-18 08:11:16
...

安装yii-queue扩展

composer require --prefer-dist yiisoft/yii2-queue

注释:composer已配置全局变量,所以可以直接使用composer进行安装

配置

common/config/main.php 中配置,使用redis作为驱动

components中添加

'bootstrap' => [
    'queue',
],
'redis' => [
    'class' => 'yii\redis\Connection',
    'hostname' => '127.0.0.1',
    'port' => 6379,
    'database' => 0,
],
'queue' => [
    'class' => \yii\queue\redis\Queue::class,
    'as log' => \yii\queue\LogBehavior::class,//错误日志 默认为 console/runtime/logs/app.log
    'redis' => 'redis', // 连接组件或它的配置
    'channel' => 'queue', // Queue channel key
],

启动

项目内启动

进入项目的根目录,执行下列命令:

yii queue/listen

linux环境下,进程的启动

阿里云安装命令:

yum install supervisor

配置:

进入/etc/supervisord.d

创建文件,

文件名需要以.ini结尾,假定文件名为queue1.ini

文件内容为:

[program:pro_queue]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/project_name/yii queue/listen --verbose=1 --color=0
autostart=true
autorestart=true
user=root
numprocs=4
redirect_stderr=true
stdout_logfile=/var/log/projectName/yii-queue-worker.log
注释:program:项目名,自定义

           command:启动的命令,/var/www/html/project_name为项目的根目录,yii queue/listen为队列的启动命令

          user:supervisor执行的角色

         stdout_logfile:日志,自定义存储路径

启动进程

systemctl start supervisord

队列的使用

创建队列文件SendEmailTask.php

<?php

namespace common\queue;

use PHPMailer\PHPMailer\PHPMailer;
use yii\base\BaseObject;
use Yii;
/**
 * 异步发送邮件
*/

class SendEmailTask extends BaseObject implements \yii\queue\JobInterface
{
    public $subject;//邮件的标题
    public $body;//邮件的内容
    public $address;//发送的邮件地址

    public function execute($queue)
    {
        $mailParam = include_once dirname(dirname(dirname(__FILE__))).'/frontend/config/params.php';//调用邮件的配置文件
        $mail = new PHPMailer();//实例化邮件的队形
        $mail->CharSet = "UTF-8";//设置编码格式
        $mail->isSMTP();
        $mail->Host = $mailParam['adminHost']; // Specify main and backup SMTP servers
        $mail->SMTPAuth = true; // Enable SMTP authentication
        $mail->Username = $mailParam['adminEmail'];//发送者邮箱
        $mail->Password = $mailParam['adminPassword'];//发送邮件密码
        $mail->SMTPSecure = $mailParam['adminSecure'];
        $mail->Port = $mailParam['adminPort']; // TCP port to connect to
        $mail->setFrom($mailParam['adminEmail'], $mailParam['adminFromName']);
        $mail->addAddress($this->address);
        $mail->isHTML(true);
        $mail->Subject = $this->subject;
        $mail->Body = $this->body;
        $mail->send();
    }
}

 

将任务追加到队列:

在要调用队列的地方,添加下列语句:

Yii::$app->queue->push(new SendEmailTask([
    'subject' => $subject,
    'body' => $body,
    'address' => $email,
]));

注释:参数时队列对象里的属性

到这里队列就可以使用了,队列的监听进程,监听到新的任务进入队列时,会相应的进行对列任务的处理。