前言
最近在做一個項目,做項目的過程中遇到了要使用queue的場景,芳哥跟我說,這個你可以用隊列來實現。我想了想,嗯?隊列,隊列不就是先進先出的哪一種嗎?后來翻看laravel文檔發現,原來queue並不是我所想的數據結構的隊列,而是另外一種東西。
正文
1. 為什么要用queue?
比如有大量的請求一下發過來,服務器來不及處理,而用戶急需回應,這個時候你就需要先給用戶回應,然后慢慢的去處理這些請求。在這個項目中,因為涉及到文件上傳,如果單線程執行的話,系統資源沒有充分被利用,而且刷新目錄的時候,要等文件上傳完才會出現完整的目錄結構,對於用戶來說體驗不是很友好,所以就使用queue來處理了。
2. 怎么使用queue?
隊列的思想就是先把待執行的任務存下來,然后你再啟用服務,去執行這些隊列里的任務。
(1)連接
所謂的連接就是你把這些任務存在哪里,一般可以存在數據庫中,redis中。
config/queue.php
配置文件里,有一個 connections
配置選項。這個選項給 Amazon SQS,Beanstalk,或者 Redis 這樣的后端服務定義了一個特有的連接。不管是哪一種,一個給定的連接可能會有多個 「隊列」,而 「隊列」 可以被認為是不同的棧或者大量的隊列任務。
queue
配置文件中每個連接的配置示例中都包含一個 queue
屬性。這是默認隊列任務被發給指定連接的時候會被分發到這個隊列中。換句話說,如果你分發任務的時候沒有顯式定義隊列,那么它就會被放到連接配置中 queue
屬性所定義的隊列中:
// 這個任務將被分發到默認隊列... Job::dispatch(); // 這個任務將被發送到「emails」隊列... Job::dispatch()->onQueue('emails');
設置超時時間:
<?php namespace App\Jobs; class ProcessPodcast implements ShouldQueue { /** * 任務運行的超時時間。 * * @var int */ public $timeout = 120; }
指定隊列:
php artisan queue:work redis --queue=emails
如果你想多線程的話,可以多起幾個。