你是否也困在redis,知其然不知其所以然~~ 專案中,到底怎麼用?? 乙個簡單的例項,使用訊息佇列實現下yii非同步傳送郵件
首先得配置redis服務,之前寫過相關的文章,可以參考下這裡
yii的redis操作庫:
使用composer安裝redis的依賴庫
php composer.phar require
--prefer-dist yiisoft/yii2-redis
web.php的相關配置:
return [
//....
'components' => [
'redis' => [
'class' => 'yii\redis\connection',
'hostname' => 'localhost',
'port' => 6379,
'database' => 0,],]
];
到此,yii中就可以使用redis進行操作了
那麼如何實現非同步訊息佇列傳送郵件呢??
傳統的操作方法是這樣的:
使用者輸入郵件資訊
伺服器獲取使用者輸入的資料,提交到第三方的郵件伺服器
第三方郵件伺服器傳送郵件,返回處理結果
非同步的處理郵件傳送:
使用者輸入郵件相關資訊
將註冊資訊儲存在記憶體佇列,通知使用者傳送成功
伺服器端監聽記憶體佇列,將記憶體佇列中的郵件資料依次傳送 使用者感知不到
兩者的區別在哪?
非同步相對於同步來說,頁面非阻塞,減少了使用者等待的時間體驗相對來說比較好
原理:使用者輸入郵件資訊,伺服器接收到輸入的郵件資訊,呼叫mail的過程,實則是對mail類屬性賦值的過程,這個時候,我們可以抓取使用者的資訊,儲存到佇列,然後在佇列中,依次讀取郵件資訊,進行傳送
//例項化mail元件
$mailer->setfrom('發件人位址');
$mailer->setto('收件人位址');
$mailer->setsubject('傳送標題');
//if ($mailer->send() && $this->reg($data, 'regbymail'))
這個時候 會去例項化mail類 進行郵件傳送,這個時候 我們可以抓取郵件資訊 儲存到佇列中
<?php
namespace
mail\mailerqueue;
useyii;
class
message
extends \yii\swiftmailer\message
// 0 - 15 select 0 select 1
// db => 1
//mail郵件儲存的資料庫 是否存在
if (empty($mailer) || !$redis->select($mailer->db))
//抓取郵件資訊
$message = ;
$message['from'] =array_keys($this->from);
$message['to'] = array_keys($this->getto());
$message['cc'] = array_keys($this->getcc());
$message['bcc'] = array_keys($this->getbcc());
$message['reply_to'] = array_keys($this->getreplyto());
$message['charset'] = array_keys($this->getcharset());
$message['subject'] = array_keys($this->getsubject());
//獲取郵件資訊及子資訊
$parts = $this->getswiftmessage()->getchildren();
if (!is_array($parts) || !sizeof($parts))
foreach ($parts as $part)
if (!$message['charset']) }}
//序列化抓取的內容 存放到佇列中
return $redis->rpush($mailer->key, json_encode($message));}}
接下來就是讀取redis佇列,進行傳送的過程
<?php
namespace
mail\mailerqueue;
useyii;
class
mailerqueue
extends \yii\swiftmailer\mailer
//如果佇列中 存在資料
if ($redis->select($this->db) && $messages = $redis->lrange($this->key, 0, -1))
if ($messageobj->send())}}
return
true;
}//設定訊息頭部
public
function
setmessage
($messageobj, $message)
if (!empty($message['from']) && !empty($message['to']))
if (!empty($message['bcc']))
if (!empty($message['reply_to']))
if (!empty($message['charset']))
if (!empty($message['subject']))
if (!empty($message['html_body']))
if (!empty($message['text_body']))
return $messageobj;
}return
false;
}}
到此 我們就實現了redis佇列非同步傳送郵件 redis的簡單使用 非同步傳送郵件
你是否也困在redis,知其然不知其所以然 專案中,到底怎麼用?乙個簡單的例項,使用訊息佇列實現下yii非同步傳送郵件 首先得配置redis服務,之前寫過相關的文章,可以參考下這裡 yii的redis操作庫 使用composer安裝redis的依賴庫 php composer.phar requir...
使用 MimeKit 和 MailKit 傳送郵件
mimekit 給.net 社群帶來了一流的 mime 解析器,它能處理複雜的各種mime,效能好。而且開箱即用支援 s mime 和 pgp。mimekit 和 mailkit 支援最新的國際化的電子郵件標準,是.net 中為乙個支援完整支援這些標準電子郵件庫,最近正式發布了1.0版本。如果你想做...
使用swoole非同步傳送郵件
傳送郵件的操作一般是比較耗時的,所以我們一般採用非同步或者佇列來執行。php使用redis的publish subscribe也是一種不錯的選擇,這在以前的一篇博文中寫過。php語言本身是不支援非同步操作的,不過我們可以通過swoole擴充套件實現非同步功能,這個非同步功能基於tcp協議,相應速度還...