如何使用laravel queue 隊列的簡單例子


使用隊列有利於模塊與模塊,系統與系統之間的解耦,對構建高內聚,松耦合的系統很重要, 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 必須知道的一些事

 

 

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM