iT邦幫忙

2023 iThome 鐵人賽

DAY 16
0
自我挑戰組

我推的Laravel系列 第 16

【Day-15】我推的Laravel-進階篇-Queue

  • 分享至 

  • xImage
  •  

簡介

Laravel Queue中文可以翻作佇列,字面上理解就是一個等著做事的程序

在Laravel對Queue的解釋中提到,通常可能需要長時間的任務,如: 解析和儲存上傳的 CSV 文件
可以交給Queue讓網站回應速度加快(實際上程序還在背景異步處理
需要注意的是異步處理代表無法得知(或者說很難)Job處理結果以及設定回傳
必須考慮到這情況下再來使用Queue

今天一樣用簡單的例子來介紹Queue
首先,我們需要一個工作時間很長的任務(假裝)

實作

app\Repositories\PostRepository.php

public function create($data): void
{        
    $data['type'] = 'post';
    sleep(10);
    Post::create($data);
}

sleep(10); // 休眠幾秒,可以想像Post::create($data);花了10秒多

這時候需要創建StorePost異步處理
.env

QUEUE_CONNECTION=database

預設sync意思是流程中不會把Job異步處理
可以改database,意思是要把Job放到database隊列中,讓worker去照順序處理
也可以用redis等,前提是要架設相對環境
總之這裡用database

接下來到終端
php artisan queue:table 產生Job隊列表的migration
php artisan migrate 創建資料表

再來把創建StorePost Job
php artisan make:job StorePost

app\Jobs\StorePost.php

/**
 * Create a new job instance.
 */
public function __construct($data)
{
    //
    $this->data = $data;
}

/**
 * Execute the job.
 */
public function handle(): void
{
    //
    sleep(10);
    Post::create($this->data);
}

我們把剛剛會跑十秒多的程式放到這裡

然後修改
app\Repositories\PostRepository.php
最上方引用use App\Jobs\StorePost;

public function create($data): void
{        
    $data['type'] = 'post';
    // Post::create($data);
    dispatch(new StorePost($data));
}

用Postman測試後發現整個request跑了十秒多

在終端輸入
php artisan queue:work
再從Postman測試,可以發現秒回了

回到終端可以看到,確實有執行
https://ithelp.ithome.com.tw/upload/images/20230928/20163286HgeIR1weAO.png

PS:如果把.env的改成sync就會發現,即使用Queue也還是會跑十秒多

總結

Queue可以運用的情境很多,如:發Email、處理檔案等
另外Linux和Mac可以用supervisorLaravel官方文件
Windows則可以用pm2,或者是go版本的supervisord等(沒試過
管理數個Work,保持程序啟用、自動重啟、開機啟用等

像最前面提到的,了解Queue的使用情境、Queue的特性(像是批次優先順序、重試次數),再來使用Queue會比較合適


上一篇
【Day-14】我推的Laravel-進階篇-Service Container & Service Provider
下一篇
【Day-16】我推的Laravel-進階篇-Interface & Contract Pattern
系列文
我推的Laravel31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言