1. 程式人生 > >使用yii2-queue結合redis來實現佇列功能

使用yii2-queue結合redis來實現佇列功能

開發十年,就只剩下這套架構體系了! >>>   

使用yii2-queue結合redis來實現佇列功能

為什麼用它?

其實之前用過activemq,但是這個東西基於Java的,得裝一堆東西,還得配置,而且我只是比較簡單的功能,所以就沒打算上這個,不過後面瞭解到其實yii2-queue也可以結合的

安裝

首先得安裝,用的是composer,這個很簡單,在你的專案目錄下面

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

##配置

找到你的專案配置檔案,高階版是main.php,普通版console.php,在裡面加上你的配置,這個yii2-queue可以使用各種驅動模式來做,我這裡選取了redis,所以你得必須先有redis,如果沒有可以用file來驅動

 // 把這個元件註冊到控制檯
    'bootstrap' => [
        'queue',
    ],
    'components' => [
        'queue'  => [
            'class'   => \yii\queue\redis\Queue::class,
             // 連線元件或它的配置
            'redis'   => 'redis',
           // Queue channel key
            'channel' => 'queue',
            
        ],
        'redis'  => [
            'class'    => 'yii\redis\Connection',
            'hostname' => 'localhost',
            'port'     => 6379,
            'database' => 0,
        ]
    ]
    

配置就那麼簡單

使用

首先我們得寫一個隊裡檔案,裡面執行一個隊裡的任務,我這裡簡單的寫了一個

<?php
namespace common\components;
use yii\base\BaseObject;


class Job extends BaseObject implements \yii\queue\JobInterface
{
    public $url;
    public $file;

    public function execute($queue)
    {
        file_put_contents($this->file, file_get_contents($this->url));
    }
}

上面是佇列執行的檔案,我們要使用它是這樣使用的,一般在控制器裡面使用

use common\components\Job;
public function actionJob(){
   //新增任務到佇列
   Yii::$app->queue->push(new Job([
   'url' => 'http://img.netpc.com.cn/2018/06/12080502tmd.jpg',
   'file' => '/Users/gongchuandong/www/project/ideaboat\1.jpg',
   ]));
  
}

// 延時5s觸發
Yii::$app->queue->delay(5)->push(new Job([
   'url' => 'http://img.netpc.com.cn/2018/06/12080502tmd.jpg',
   'file' => '/Users/gongchuandong/www/project/ideaboat\1.jpg',
   ]));

最後你還得在命令列把這個佇列的監聽監聽起來

./yii queue/listen

這樣就可以了

我在佇列裡面執行sql的時候,發現了一個坑,無論如何都無法儲存,保這個錯誤

SQLSTATE[HY000] [2002] No such file or directory in

最後Google一下,需要把資料庫連線從localhost改