关于 Yii2.0 中消息队列的问题求一波思路?

问题 · 本文由 · 梅梅 · 发布于 26天前 · 174 阅读

需求:

我给用户发送一个链接,当用户点击之后链接失效,重点需求:如果用户不点击,则3分钟再次发送,5分钟再次发送,7分钟再次发送,还是不点击,那么就发送给客服。 在 yii2.0 框架中如何实现这个功能?给点思路也行

成为第一个本话题的爱慕者吧

最佳答案
<?php

function main() {
    Yii::$app->queue->push(new SendLinkJob([
        'link' => 'https://baidu.com',
        'startAt' => time(),
        'times' => 1,
    ]));
}


class SendLinkJob extends BaseObject implements \yii\queue\JobInterface {

    public $link;
    public $startAt;
    public $times;

    public function execute($queue)
    {
        if (! $this->isLinkValid()) {
            return false;
        }
        if (4 == $this->times) {
            return $this->sendToService();
        }

        $this->sendLink();
        Yii::$app->queue->delay($this->getDelay())->push(new SendLinkJob([
            'link'    => $this->link,
            'startAt' => $this->startAt,
            'times'   => ++$this->times,
        ]));
    }

    public function isLinkValid()
    {
        // ...
        return true;
    }

    public function sendLink()
    {
        // 发链接到客服端
    }

    public function sendToService()
    {
        // 发到客服
    }

    protected function getDelay()
    {
        switch ($this->times) {
            case 1 :
            return 180; /* 三分钟 */
            case 2 :
            return 120; /* 两分钟 */
            case 3 :
            return 120; // 两分钟
        }
    }
}
26天前 回复
评论数量:1
<?php

function main() {
    Yii::$app->queue->push(new SendLinkJob([
        'link' => 'https://baidu.com',
        'startAt' => time(),
        'times' => 1,
    ]));
}


class SendLinkJob extends BaseObject implements \yii\queue\JobInterface {

    public $link;
    public $startAt;
    public $times;

    public function execute($queue)
    {
        if (! $this->isLinkValid()) {
            return false;
        }
        if (4 == $this->times) {
            return $this->sendToService();
        }

        $this->sendLink();
        Yii::$app->queue->delay($this->getDelay())->push(new SendLinkJob([
            'link'    => $this->link,
            'startAt' => $this->startAt,
            'times'   => ++$this->times,
        ]));
    }

    public function isLinkValid()
    {
        // ...
        return true;
    }

    public function sendLink()
    {
        // 发链接到客服端
    }

    public function sendToService()
    {
        // 发到客服
    }

    protected function getDelay()
    {
        switch ($this->times) {
            case 1 :
            return 180; /* 三分钟 */
            case 2 :
            return 120; /* 两分钟 */
            case 3 :
            return 120; // 两分钟
        }
    }
}
26天前 回复
作者:梅梅