queue:listen和queue:work 區(qū)別
queue:work 默認(rèn)只執(zhí)行一次隊(duì)列請(qǐng)求, 當(dāng)請(qǐng)求執(zhí)行完成后就終止;
queue:listen 監(jiān)聽(tīng)隊(duì)列請(qǐng)求, 只要運(yùn)行著, 就能一直接受請(qǐng)求, 除非手動(dòng)終止;
queue:work --daemon 同 listen 一樣, 只要運(yùn)行著, 就能一直接受請(qǐng)求, 不一樣的地方是在這個(gè)運(yùn)行模式下, 當(dāng)新的請(qǐng)求到來(lái)的時(shí)候, 不重新加載整個(gè)框架, 而是直接 fire 動(dòng)作. 終端上不會(huì)顯示 Processed: SaveAvatorjob
能看出來(lái), queue:work --daemon 是最高級(jí)的, 一般推薦使用這個(gè)來(lái)處理隊(duì)列監(jiān)聽(tīng).
注意: 使用 queue:work --daemon , 當(dāng)更新代碼的時(shí)候, 需要停止, 然后重新啟動(dòng), 這樣才能把修改的代碼應(yīng)用上.
php artisan queue:listen --queue=saveAvatorQueue --tries=3 監(jiān)聽(tīng)某個(gè)隊(duì)列
一些命令及解釋
php artisan queue:listen --queue CreateXmlQueue --memory=4096 --timeout=6000
可以指定監(jiān)聽(tīng)器使用哪個(gè)隊(duì)列連接
php artisan queue:listen connection
可以設(shè)置每個(gè)任務(wù)允許運(yùn)行的最大時(shí)間(以秒為單位)
php artisan queue:listen --timeout=60
可以指定輪詢(xún)新任務(wù)之前的等待時(shí)間(以秒為單位):
php artisan queue:listen --sleep=5
可以在queue:listen命令上使用--tries開(kāi)關(guān)來(lái)指定任務(wù)最大可嘗試執(zhí)行次數(shù):
php artisan queue:listen connection-name --tries=3
Supervisor配置
Supervisor為L(zhǎng)inux操作系統(tǒng)提供的進(jìn)程監(jiān)視器摹菠,將會(huì)在失敗時(shí)自動(dòng)重啟queue:listen
或queue:work
命令,要在Ubuntu上安裝Supervisor澜掩,使用如下命令:
sudo apt-get install supervisor
Supervisor配置文件通常存放在/etc/supervisor/conf.d目錄,在該目錄中听哭,可以創(chuàng)建多個(gè)配置文件指示Supervisor如何監(jiān)視進(jìn)程,例如柬采,讓我們創(chuàng)建一個(gè)開(kāi)啟并監(jiān)視queue:work進(jìn)程的laravel-worker.conf文件:
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/forge/app.com/artisan queue:work sqs --sleep=3 --tries=3 --daemon
autostart=true
autorestart=true
user=forge
numprocs=8
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log
在本例中欢唾,numprocs指令讓Supervisor運(yùn)行8個(gè)queue:work進(jìn)程并監(jiān)視它們,如果失敗的話(huà)自動(dòng)重啟粉捻。配置文件創(chuàng)建好了之后礁遣,可以使用如下命令更新Supervisor配置并開(kāi)啟進(jìn)程:
sudo supervisord -c /etc/supervisord.conf
sudo supervisorctl -c /etc/supervisor/supervisord.conf
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*