使用隊列有利於模塊與模塊,系統與系統之間的解耦,對構建高內聚,松耦合的系統很重要, laravel 隊列基本工作方式:dispatch 一個 job 的時候,laravel 把 job 序列化保存到相應的 driver 中(redis、database、file...),然后 queue:listen 或 queue:work 的時候會從對應的 driver 里面取出這個 job,對 payload 反序列化,然后調用 job 里面的 handle 方法進行 job 的處理。
以下是如果在laravel使用隊列的簡單實例
1、修改.evn
設置queue為redis驅動
queue驅動主要有sync,redis,database,mq ,中小型系統建議使用redis, 復雜系統使用mq
初始默認為sync 這個分派任務的時候直接同步執行,修改為redis則使用redis 的list(盡快執行的隊列)和zset(延時執行的隊列)兩種數據類型保存,也可以用數據庫為驅動
QUEUE_CONNECTION=redis
並配置好你的redis,以下是我本機的配置
REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 REDIS_DATABASE=0
2、創建任務,例子創建一個 aSampleQueue
php artisan make:job aSampleQueue

3、修改aSampleQueue.php
class aSampleQueue implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; private $message;
public function __construct($message)
{
$this->message = $message;
//
}
//handle 方法是隊列需要執行的業務,這里用一個寫一條日志作為業務內容 public function handle() { \Log::info($this->message); // } }
4、分發內容給隊列,本例子假定在路由上調用
Route::get('/test/queue/{name}', function ($name){
App\Jobs\aSampleQueue::dispatch("創建用戶:{$name}".date('H:i:s'));//立即執行的隊列
});
假定域名為la.com,在瀏覽器輸入:http://la.com/test/queue/lucas ,到redis查看,如下圖

也可以制定隊列名onQueue('delayQueueSample')和指定執行時間addMinutes(30)
Route::get('/test/queue/{name}', function ($name){
App\Jobs\aSampleQueue::dispatch("創建用戶:{$name}".date('H:i:s'))->onQueue('delayQueueSample')->delay(\Illuminate\Support\Carbon::now()->addMinutes(30));//延遲30分鍾執行 });
在redis查到該隊列,說明寫入成功
4、用命令行執行隊列
php artisan queue:work

這是一個常駐進程,需要停止可以按ctrl+c
5、如果使用數據庫來保存隊列,執行
php artisan queue:table
php artisan migrate
並在.evn 修改
QUEUE_CONNECTION=database
完成。
參考:
1、https://blog.csdn.net/raoxiaoya/article/details/104241467 Laravel延遲隊列的實現原理
2、https://www.cnblogs.com/eleven24/p/9348932.html 使用 Laravel 的 queue 必須知道的一些事
