您好,登錄后才能下訂單哦!
這篇文章主要講解了“Laravel隊列如何使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Laravel隊列如何使用”吧!
耗時的,比如上傳一個文件后進行一些格式的轉化等。
需要保證送達率的,比如發送短信,因為要調用別人的 api,總會有幾率失敗,那么為了保證送達,重試就必不可少了。
記錄使用過程:
隊列配置文件存放在 config/queue.php,默認為 sync 同步處理,這里可以選擇 redis,database 等,使用方法如下。
數據庫
創建數據表存儲任務,執行完 artisan 命令后運行數據遷移
php artisan queue:table php artisan migrate
Redis
為了使用 redis 隊列驅動,你需要在你的配置文件 config/database.php 中配置Redis的數據庫連接。
如果你的 Redis 隊列連接使用的是 Redis 集群,你的隊列名稱必須包含 key hash tag。這是為了確保所有的 Redis 鍵對于一個給定的隊列都置于同一哈希中:
'redis' => [ 'driver' => 'redis', 'connection' => 'default', 'queue' => 'default', 'retry_after' => 90, ],
隊列的任務類在 app/Jobs/ 目錄下
php artisan make:job SaveBusLine
修改文件如下:
namespace App\Jobs; use App\Http\Repository\BusRepository; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; class SaveBusLine implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; /** * 任務最大嘗試次數。 * * @var int */ public $tries = 3; /** * 任務運行的超時時間。 * * @var int */ public $timeout = 60; private $datum; /** * Create a new job instance. * @param array|object $datum * * @return void */ public function __construct($datum) { $this->datum = $datum; } /** * Execute the job. * * @return void */ public function handle() { BusRepository::getInstent()->updateBusLine($this->datum); } }
在控制器或倉庫中調用隊列方法:
use App\Jobs\SaveBusLine; use Carbon\Carbon; /***************** 隊列操作 start *******************/ SaveBusLine::dispatch($arrayData)->delay(Carbon::now()->addMinute(1)); /***************** 隊列操作 end *******************/
php artisan queue:work
安裝 Supervisor
Supervisor 是一個 Linux 操作系統上的進程監控軟件,它會在 queue:listen 或 queue:work 命令發生失敗后自動重啟它們。在 Ubuntu 安裝 Supervisor,可以用以下命令:
sudo apt-get install supervisor
{tip} 如果自己手動配置 Supervisor 聽起來有點難以應付,可以考慮使用 Laravel Forge,它能給你的 Laravel 項目自動安裝與配置 Supervisor。
配置 Supervisor
Supervisor 的配置文件一般是放在 /etc/supervisor/conf.d 目錄下。在這個目錄中你可以創建任意數量的配置文件來要求 Supervisor 怎樣監控你的進程。例如我們創建一個 laravel-worker.conf 來啟動與監控一個 queue:work 進程:
[program:laravel-worker] process_name=%(program_name)s_%(process_num)02d command=php ~/laravel/artisan queue:work redis --sleep=3 --tries=3 autostart=true autorestart=true user=lisgroup numprocs=8 redirect_stderr=true stdout_logfile=/home/lisgroup/logs/worker.log
這個例子里的 numprocs 命令會要求 Supervisor 運行并監控 8 個 queue:work 進程,并且在它們運行失敗后重新啟動。當然,你必須更改 command 命令的 queue:work redis ,以顯示你所選擇的隊列驅動。還需要修改執行的用戶 user=XXX
啟動 Supervisor
當這個配置文件被創建后,你需要更新 Supervisor 的配置,并用以下命令來啟動該進程:
sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start laravel-worker:*
有時候你隊列中的任務會失敗。不要擔心,本來事情就不會一帆風順。Laravel 內置了一個方便的方式來指定任務重試的最大次數。當任務超出這個重試次數后,它就會被插入到 failed_jobs 數據表里面。要創建 failed_jobs 表的遷移文件,你可以用 queue:failed-table 命令,接著使用 migrate Artisan 命令生成 failed_jobs 表:
php artisan queue:failed-table php artisan migrate
然后運行隊列處理器,在調用 queue worker,命令時你應該通過 --tries 參數指定任務的最大重試次數。如果不指定,任務就會永久重試:
php artisan queue:work redis --tries=3
你可以在任務類里直接定義 failed 方法,它能在任務失敗時運行任務的清除邏輯。這個地方用來發一條警告給用戶或者重置任務執行的操作等再好不過了。導致任務失敗的異常信息會被傳遞到 failed 方法:
namespace App\Jobs; use Exception; use App\Podcast; use App\AudioProcessor; use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; class ProcessPodcast implements ShouldQueue { use InteractsWithQueue, Queueable, SerializesModels; protected $podcast; /** * 創建一個新的任務實例。 * * @param Podcast $podcast * @return void */ public function __construct(Podcast $podcast) { $this->podcast = $podcast; } /** * 執行任務。 * * @param AudioProcessor $processor * @return void */ public function handle(AudioProcessor $processor) { // 處理上傳播客... } /** * 要處理的失敗任務。 * * @param Exception $exception * @return void */ public function failed(Exception $exception) { // 給用戶發送失敗通知,等等... } }
感謝各位的閱讀,以上就是“Laravel隊列如何使用”的內容了,經過本文的學習后,相信大家對Laravel隊列如何使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。