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 重啟服務