前言
本篇重點如下:
- 使用 Laravel queue 完成寄 Email 功能
- 使用 AWS SQS
為什麼要使用 queue
呢?
當我們執行一些耗時較久的工作時,像是發送 Email , 或是上傳圖片或是影片,讓使用者等到工作執行完畢才進行下一個動作的話,是不太現實的。
所以當使用者發出一些需要較長時間執行的請求時,我們要使用 queue
來幫我們隊列,在背景慢慢執行,然後讓使用者可以立即執行下一個動作。
申請 AWS SQS 服務
到右上角,選擇帳戶的地方,選擇
My Security Credentials
到左邊選擇
Users
建立新的 User
輸入 user 名稱,打勾 Programmatic access ,然後下一步
然後
Create group
,如下圖再來把剛剛建立的 user 加到這個新建的 group
接下來 Add tags 是選填,不一定要填
然後就可以獲得
Access key ID
以及Secret access key
,如果怕忘記的話,可以下載下來哦! 這個Secret access key
只會出現一次哦,如果不小心忘記或沒有記下來的話,就要重新產生哦!
實作 Laravel queue
配置 AWS SQS
- 以下操作均參考官方文件
- 安裝 AWS 官方 SDK ,參照官方文件 ,在專案資料夾底下:
composer require aws/aws-sdk-php
- 在
.env
檔案中,做以下配置QUEUE_CONNECTION=sqs
SQS_KEY=上面拿到的 key
SQS_SECRET=上面拿到的 secret
SQS_QUEUE=testSQS
SQS_REGION=ap-northeast-1
SQS_PREFIX=依照上面的URL去掉queue名稱後填入
建立 jobs
php artisan make:job ProcessPodcast |
job
範本如下<?php
namespace App\Jobs;
use App\Helpers;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
class SendMailWhenOrderPlaced implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $job;
// 嘗試執行最高次數
public $tries = 5;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($order, $FB_email, $Local_email)
{
$this->order = $order;
$this->FB_email = $FB_email;
$this->Local_email = $Local_email;
$this->job = Helpers::mailWhenOrderPlaced($order, $FB_email, $Local_email);
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
return $this->job;
}
}
上面的範例,是使用 queue
來執行 Ray 專案裡頭的一個寄送 Email 的功能,叫做 mailWhenOrderPlaced
。
使用 dispatch
- 在我們想要執行這一個
job
的地方,使用dispatch
,就可以囉!SendMailWhenOrderPlaced::dispatch($order, $FB_email, $Local_email);
執行 queue
- 在專案底下,執行
php artisan queue:work
測試
- 這個時候,當程式執行到
dispatch
那行時,就會使用queue
來執行哦!
總結
是不是很簡單啊?
另外,因為我們使用了 queue
,所以必須要確保 queue
的運作是正常的。以這個例子來說的話,如果 queue
不幸失效了,那這個發 Email
的功能就會失效哦!
為了確保 queue
在失敗後重新自動執行,我們需要 Supervisor
來幫我們監控並管理程序!
關於 Supervisor
,可以參考 Ray 的另外一篇文章哦!
如果想知道如何用 Laravel Mail
以及 AWS SES
來發送 mail
,也可以參考 Ray 的另外一篇文章
留言