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隊列表的migrationphp artisan migrate
創建資料表
再來把創建StorePost Jobphp 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測試,可以發現秒回了
回到終端可以看到,確實有執行
PS:如果把.env的改成sync就會發現,即使用Queue也還是會跑十秒多
Queue可以運用的情境很多,如:發Email、處理檔案等
另外Linux和Mac可以用supervisor,Laravel官方文件
Windows則可以用pm2,或者是go版本的supervisord等(沒試過
管理數個Work,保持程序啟用、自動重啟、開機啟用等
像最前面提到的,了解Queue的使用情境、Queue的特性(像是批次優先順序、重試次數),再來使用Queue會比較合適