[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

  1. 將 default 改成 sqs('default' => 'sqs')
  2. 設定 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 」。