thinkphp+queue+supervisor隊列消息和進程守護

thinkphp5.1.36+queue2.0

1.thinkhphp安裝queue擴展

我使用的是composer安裝(composer安裝地址:https://pkg.phpcomposer.com
直接在項目根目錄運行 composer require topthink/think-queue

2.配置queue

安裝完后會在config文件下生成一個queue.php文件,配置項如下:(使用的是redis驅動,服務器是linux,安裝很方便,yum install redis)

  return [
       'connector'  => 'Redis',         // Redis 驅動
       'expire'     => 60,              // 任務的過期時間,默認為60秒; 若要禁用,則設置為 null 
       'default'    => 'default',       // 默認的隊列名稱
       'host'       => '127.0.0.1',     // redis 主機ip
       'port'       => 6379,            // redis 端口
       'password'   => '',              // redis 密碼
       'select'     => 0,               // 使用哪一個 db,默認為 db0
       'timeout'    => 0,               // redis連接的超時時間
       'persistent' => false,           // 是否是長連接
   ];

3.創(chuàng)建任務

單模塊項目推薦使用 app\job 作為任務類的命名空間 多模塊項目可用使用 app\module\job 作為任務類的命名空間 也可以放在任意可以自動加載到的地方

任務類不需繼承任何類,如果這個類只有一個任務,那么就只需要提供一個fire方法就可以了,如果有多個小任務,就寫多個方法,下面發(fā)布任務的時候會有區(qū)別
每個方法會傳入兩個參數(shù) think\queue\Job $job (當前的任務對象) 和 $data(發(fā)布任務時自定義的數(shù)據(jù))

還有個可選的任務失敗執(zhí)行的方法 failed 傳入的參數(shù)為$data(發(fā)布任務時自定義的數(shù)據(jù))

namespace app\job;

use think\queue\Job;

class Job1{
    
    public function fire(Job $job, $data){
    
            //....這里執(zhí)行具體的任務 
            
             if ($job->attempts() > 3) {
                  //通過這個方法可以檢查這個任務已經(jīng)重試了幾次了
             }
            //如果任務執(zhí)行成功后 記得刪除任務,不然這個任務會重復執(zhí)行,直到達到最大重試次數(shù)后失敗后,執(zhí)行failed方法
            $job->delete();
            
            // 也可以重新發(fā)布這個任務
            $job->release($delay); //$delay為延遲時間
          
    }
    public function failed($data){
    
        // ...任務達到最大重試次數(shù)后,失敗了
    }

}

4.發(fā)布任務
think\Queue::push($job, $data = '', $queue = null)think\Queue::later($delay, $job, $data = '', $queue = null) 兩個方法,前者是立即執(zhí)行,后者是在 $delay 秒后執(zhí)行
$job是任務名
單模塊的,且命名空間是 app\job 的,比如上面的例子一,寫Job1類名即可
多模塊的,且命名空間是 app\module\job 的,寫 model/Job1 即可
如果一個任務類里有多個小任務的話,需要用 @+方法名app\lib\job\Job2@task1、app\lib\job\Job2@task2
$data 是你要傳到任務里的參數(shù)
$queue 隊列名,指定這個任務是在哪個隊列上執(zhí)行,同下面監(jiān)控隊列的時候指定的隊列名,可不填
5.安裝supervisor
yum install supervisor
6.配置
安裝好后在/etc/會生成一個supervisord.conf文件及一個supervisord.d文件目錄
supervisord.conf是一些默認配置,可自行修改:

[unix_http_server]
file=/tmp/supervisor.sock   ;UNIX socket 文件,supervisorctl 會使用
;chmod=0700                 ;socket文件的mode,默認是0700
;chown=nobody:nogroup       ;socket文件的owner,格式:uid:gid
 
;[inet_http_server]         ;HTTP服務器,提供web管理界面
;port=127.0.0.1:9001        ;Web管理后臺運行的IP和端口,如果開放到公網(wǎng),需要注意安全性
;username=user              ;登錄管理后臺的用戶名
;password=123               ;登錄管理后臺的密碼
 
[supervisord]
logfile=/tmp/supervisord.log ;日志文件,默認是 $CWD/supervisord.log
logfile_maxbytes=50MB        ;日志文件大小,超出會rotate,默認 50MB,如果設成0,表示不限制大小
logfile_backups=10           ;日志文件保留備份數(shù)量默認10,設為0表示不備份
loglevel=info                ;日志級別,默認info,其它: debug,warn,trace
pidfile=/tmp/supervisord.pid ;pid 文件
nodaemon=false               ;是否在前臺啟動,默認是false,即以 daemon 的方式啟動
minfds=1024                  ;可以打開的文件描述符的最小值,默認 1024
minprocs=200                 ;可以打開的進程數(shù)的最小值,默認 200
 
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ;通過UNIX socket連接supervisord,路徑與unix_http_server部分的file一致
;serverurl=http://127.0.0.1:9001 ; 通過HTTP的方式連接supervisord
 
; [program:xx]是被管理的進程配置參數(shù),xx是進程的名稱
[program:xx]
command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run  ; 程序啟動命令
autostart=true       ; 在supervisord啟動的時候也自動啟動
startsecs=10         ; 啟動10秒后沒有異常退出,就表示進程正常啟動了,默認為1秒
autorestart=true     ; 程序退出后自動重啟,可選值:[unexpected,true,false],默認為unexpected,表示進程意外殺死后才重啟
startretries=3       ; 啟動失敗自動重試次數(shù),默認是3
user=tomcat          ; 用哪個用戶啟動進程,默認是root
priority=999         ; 進程啟動優(yōu)先級,默認999,值小的優(yōu)先啟動
redirect_stderr=true ; 把stderr重定向到stdout,默認false
stdout_logfile_maxbytes=20MB  ; stdout 日志文件大小,默認50MB
stdout_logfile_backups = 20   ; stdout 日志文件備份數(shù),默認是10
; stdout 日志文件,需要注意當指定目錄不存在時無法正常啟動,所以需要手動創(chuàng)建目錄(supervisord 會自動創(chuàng)建日志文件)
stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out
stopasgroup=false     ;默認為false,進程被殺死時,是否向這個進程組發(fā)送stop信號,包括子進程
killasgroup=false     ;默認為false,向進程組發(fā)送kill信號,包括子進程
 
;包含其它配置文件
[include]
files = relative/directory/*.ini    ;可以指定一個或多個以.ini結束的配置文件

最后一行,個人習慣命名conf,改為

[include]
files = relative/directory/*.conf

/etc/supervisord.d目錄用來存放用戶自定義的進程配置,參考:

command=php think queue:work --queue RecordJob --daemon ;執(zhí)行命令
directory=/home/phpweb/gwjkj/ ;執(zhí)行命令目錄
user=phpweb ;執(zhí)行命令用戶
stdout_logfile=/opt/supervisor_log/run.log ;日志位置
autostart=true ;
autorestart=true ;
startsecs=60 ;
stopasgroup=true ;
ikillasgroup=true ;
startretries=1 ;
redirect_stderr=true ;

7.啟動服務
service supervisord start 啟動服務
service supervisord stop 終止服務
service supervisord restart 重啟服務

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容