# 隊列配置
文檔最后更新時間:2021-12-16 16:38:06
### 注意事項
**請不要將緩存驅動配置為 redis,會出現`Function Redis::delete() is deprecated`錯誤**
**如果緩存驅動是redis,請將隊列的 redis 配置和 redis 的配置的 select (redis db 庫) 設置成一樣的,并且絕對不能和 cache 的 select (redis db 庫) 一樣,否則 fastadmin 后臺右上角 清除緩存 將把所有緩存清除,包括隊列任務**
**普通優先級和高優先級兩個隊列監聽都必須要配置**
**php 必須要安裝 redis 擴展**
**安裝完redis 請一定記得重啟 nginx 服務**
* * *
### 隊列配置
* 為了提高系統性能,靈活性,將 訂單自動關閉時間,自動確認時間,自動評價時間,以及 訂單支付完成后續事件都放到隊列異步處理,請務必配置隊列
#### 安裝隊列 composer 包 (最新版的 fastadmin 已經預裝)
> 如果依賴安裝中已安裝,這一步可以忽略
~~~
composer require topthink/think-queue:v1.1.6
~~~
#### 配置隊列,建議使用 redis 驅動
~~~
安裝好之后會自動創建配置文件
編輯
application/extra/queue.php
'connector' => 'redis', // 隊列驅動使用 redis 推薦, 可選 database
'host' => '127.0.0.1', // redis 主機地址
'password' => '', // redis 密碼
'port' => 6379, // redis 端口
'select' => 1, // redis db 庫, 建議顯示指定 1-15 的數字均可,如果緩存驅動是 redis,避免和緩存驅動 select 沖突
'timeout' => 0, // redis 超時時間
'persistent' => false, // redis 持續性,連接復用
~~~
#### php 安裝 redis 擴展(驅動是 redis時必須安裝)
##### 寶塔安裝方式

### 配置隊列監聽
#### 命令行調試
> 可排查 supervisor 無法啟動的錯誤
部分小伙伴寶塔`supervisor`按照文檔配置好之后,總是出現無法啟動的情況,一般情況是寶塔默認禁用了 php 部分函數,需要手動刪除被禁用的函數,請點擊查看[依賴安裝](https://doc.fastadmin.net/shopro/357.html)刪除禁用函數
按照如下方式排查
~~~
進入項目目錄
cd /www/wwwroot/項目目錄 // 這是寶塔默認項目目錄,請自行進入自己的項目目錄
執行(該進程會一直監聽)
php think queue:listen --queue=shopro-high
前端下單并支付(可以余額支付),之后看看命令會出現報錯的打印結果,自行根據報錯結果解決問題
解決之后將進程按 ctrl + c 結束,并執行如下命令更新項目權限,避免因為剛才執行命令導致的權限錯誤
chown -R www:www /www/wwwroot/項目目錄
去寶塔重新啟動 supervisor 進程
~~~
#### 寶塔面板配置,僅支持 linux【推薦】
> 請在寶塔面板,軟件商店,搜索并安裝 supervisor

為保證高優先級的執行效率,需要配置兩個隊列監聽進程
~~~
高優先級隊列啟動命令
php think queue:listen --queue shopro-high
普通優先級隊列啟動命令
php think queue:listen --queue shopro
~~~
#### 使用 supervisor 做進程守護,如果不是寶塔環境,僅支持 linux【推薦】
請自行安裝 supervisor 軟件
配置 supervisor
~~~
注意將下面的 command 和 directory 配置為自己的目錄
// 普通隊列
[program:shopro]
process_name=%(program_name)s_%(process_num)02d
command=/usr/bin/php /www/wwwroot/項目目錄/think queue:listen --queue shopro
directory=/www/wwwroot/項目目錄
numprocs=1
autostart=true
autorestart=true
user=www
redirect_stderr=true
stdout_logfile=/var/log/supervisor/shopro.log
stderr_logfile=/var/log/supervisor/shopro_err.log
// 高優先級隊列
[program:shopro-high]
process_name=%(program_name)s_%(process_num)02d
command=/usr/bin/php /www/wwwroot/項目目錄/think queue:listen --queue shopro-high
directory=/www/wwwroot/項目目錄
numprocs=1
autostart=true
autorestart=true
user=www
redirect_stderr=true
stdout_logfile=/var/log/supervisor/shopro-high.log
stderr_logfile=/var/log/supervisor/shopro-high_err.log
~~~
#### 簡單方式,不安裝 supervisor 【不推薦】
> 沒有啟動守護進程,命令可能異常終止,需要時刻關注隊列監聽進程是否還在運行
~~~
命令格式:
nohup sudo -u [php-fpm 執行用戶|www] [php命令地址|/usr/bin/php] [think命令地址|/www/wwwroot/shopro/think] queue:listen >> /tmp/shopro.output 2>&1 &
示例:
// 普通隊列
nohup sudo -u www /usr/bin/php /www/wwwroot/shopro/think queue:listen --queue=shopro >> /tmp/shopro.output 2>&1 &
// 高優先級隊列
nohup sudo -u www /usr/bin/php /www/wwwroot/shopro/think queue:listen --queue=shopro-high >> /tmp/shopro.output 2>&1 &
~~~
#### 注意事項
* 建議使用 redis 驅動
* 如果切換隊列驅動,請保證現有隊列已經全部執行完畢,否則現有隊列任務全部會丟失
* * *
### 分割線
* * *
### 【請不要配置緩存驅動為 redis】 緩存使用 redis 驅動時是這個樣子的
#### 注意事項
> 緩存配置 redis 之后,可以提高系統性能,但是會帶來一些影響,必須要注意
* cache 如果用 redis ,請將緩存配置的 select 庫設置成和 隊列以及活動不一樣的 select 庫
* 因為 thinkphp 版本問題,可能會報 Function Redis::delete() is deprecated 錯誤,請自行百度解決
~~~
application/config.php 文件
'cache' => [
'type' => 'Redis', // 這里配置了 redis 驅動,默認是 File
...
],
~~~