[Note] Laravel 使用 sqs 做 Queue Server 寄 Email
此篇目的在於使用 Amazon SQS (Simple Queue Service) 作為 Queue Server,以另一台機器作為 Queue Worker 來寄送 Email,使 Production Server 能更專注在服務網站,使用者體驗也會更好(若沒使用 Queue Server 使用 sync 模式寄送 Email,會讓使用者操作停住等待發送完成才能繼續動作)。
第一步:設定 app/config/queue.php
- 將 default 改成 sqs('default' => 'sqs')
- 設定 sqs
'sqs' => array(
'driver' => 'sqs',
'key' => 'your sqs key',
'secret' => 'your secret',
'queue' => 'your queue url',
'region' => 'us-west-2',
),
註:同理可設定為其他第三方平台(如:ironmq)
第二步:解決 Mail:queue 的 Closure 問題
此處以發送重設密碼信件為例,Closure 概念可參考此篇文章
static public function noticeResetPassword($user)
{
$data['user_name'] = $user->nickname;
$data['user_email'] = $user->email;
Mail::queue('emails.noticeResetPassword', $data, function($message) use ($data)
{
$message->from('account@yourdomain.com', 'your service name');
$message->to($data['user_email'], $data['user_nickname'])->subject('[提醒] 您的密碼已重新設定');
});
}
function ... use ... 是 PHP Closure 的用法,讓 callback 函式需要額外變數資料(原本不在函式內的變數)的時候,在定義時一起帶進去,事先將所需的變數記憶體位置 Reference 起來。所以若是要用不同機器處理 callback 函式那就不能這樣使用。
這裡使用「 Mail::queue('emails.noticeResetPassword', $data, function($message) use ($data) 」將 Closure 帶的變數與傳給 Mail::queue 的變數一樣就可以解決了。不然會發生錯誤「 ErrorException: Insufficient data for unserializing 」。