摘要:你是否也困在,知其然不知其所以然項目中到底怎么用一個簡單的實例使用消息隊列實現(xiàn)下異步發(fā)送郵件準備工作首先得配置服務(wù),之前寫過相關(guān)的文章,可以參考下這里的操作庫使用安裝的依賴庫的相關(guān)配置到此中就可以使用進行操作了同步與異步那么如何實現(xiàn)
你是否也困在redis,知其然不知其所以然~~ 項目中,到底怎么用?? 一個簡單的實例,使用消息隊列實現(xiàn)下yii異步發(fā)送郵件
redis~~準備工作:首先得配置redis服務(wù),之前寫過相關(guān)的文章,可以參考下這里 https://segmentfault.com/a/11...
yii的redis操作庫:https://github.com/yiisoft/yi...
使用composer安裝redis的依賴庫
php composer.phar require --prefer-dist yiisoft/yii2-redis
web.php的相關(guān)配置:
return [ //.... "components" => [ "redis" => [ "class" => "yii edisConnection", "hostname" => "localhost", "port" => 6379, "database" => 0, ], ] ];
到此,yii中就可以使用redis進行操作了
redis~~同步與異步那么如何實現(xiàn)異步消息隊列發(fā)送郵件呢??
傳統(tǒng)的操作方法是這樣的:
用戶輸入郵件信息
服務(wù)器獲取用戶輸入的數(shù)據(jù),提交到第三方的郵件服務(wù)器
第三方郵件服務(wù)器發(fā)送郵件,返回處理結(jié)果
異步的處理郵件發(fā)送:
用戶輸入郵件相關(guān)信息
將注冊信息存儲在內(nèi)存隊列,通知用戶發(fā)送成功
服務(wù)器端監(jiān)聽內(nèi)存隊列,將內(nèi)存隊列中的郵件數(shù)據(jù)依次發(fā)送 用戶感知不到
兩者的區(qū)別在哪?
異步相對于同步來說,頁面非阻塞,減少了用戶等待的時間體驗相對來說比較好
redis~~郵件發(fā)送原理:
用戶輸入郵件信息,服務(wù)器接收到輸入的郵件信息,調(diào)用mail的過程,實則是對mail類屬性賦值的過程,這個時候,我們可以抓取用戶的信息,存儲到隊列,然后在隊列中,依次讀取郵件信息,進行發(fā)送
//實例化mail組件 $mailer = Yii::$app->mailer->compose(); $mailer->setFrom("發(fā)件人地址"); $mailer->setTo("收件人地址"); $mailer->setSubject("發(fā)送標題"); //if ($mailer->send() && $this->reg($data, "regbymail")) { //注意這里 本身是直接調(diào)用 send方法 進行發(fā)送 現(xiàn)在重寫父類方法 使用redis進行處理 if ($mailer->queue()) { return true; }
這個時候 會去實例化mail類 進行郵件發(fā)送,這個時候 我們可以抓取郵件信息 存儲到隊列中
redis; if (empty($redis)) { throw new yiiaseInvalidConfigException("redis not found in config."); } // 0 - 15 select 0 select 1 // db => 1 $mailer = Yii::$app->mailer; //mail郵件存儲的數(shù)據(jù)庫 是否存在 if (empty($mailer) || !$redis->select($mailer->db)) { throw new yiiaseInvalidConfigException("db not defined."); } //抓取郵件信息 $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)) { $parts = [$this->getSwiftMessage()]; } foreach ($parts as $part) { if (!$part instanceof Swift_Mime_Attachment) { //獲取內(nèi)容類型 switch($part->getContentType()) { case "text/html": $message["html_body"] = $part->getBody(); break; case "text/plain": $message["text_body"] = $part->getBody(); break; } if (!$message["charset"]) { $message["charset"] = $part->getCharset(); } } } //序列化抓取的內(nèi)容 存放到隊列中 return $redis->rpush($mailer->key, json_encode($message)); } } 接下來就是讀取redis隊列,進行發(fā)送的過程 redis; if (empty($redis)) { throw new yiiaseInvalidConfigException("redis not found in config."); } //如果隊列中 存在數(shù)據(jù) if ($redis->select($this->db) && $messages = $redis->lrange($this->key, 0, -1)) { $messageObj = new Message; //遍歷郵件列表 foreach ($messages as $message) { $message = json_decode($message, true); if (empty($message) || !$this->setMessage($messageObj, $message)) { throw new ServerErrorHttpException("message error"); } if ($messageObj->send()){ $redis->lrem($this->key, -1, json_encode($message)); } } } return true; } //設(shè)置消息頭部 public function setMessage($messageObj, $message) { if (empty($messageObj)) { return false; } if (!empty($message["from"]) && !empty($message["to"])) { $messageObj->setFrom($message["from"])->setTo($message["to"]); if (!empty($message["cc"])) { $messageObj->setCc($message["cc"]); } if (!empty($message["bcc"])) { $messageObj->setBcc($message["bcc"]); } if (!empty($message["reply_to"])) { $messageObj->setReplyTo($message["reply_to"]); } if (!empty($message["charset"])) { $messageObj->setCharset($message["charset"]); } if (!empty($message["subject"])) { $messageObj->setSubject($message["subject"]); } if (!empty($message["html_body"])) { $messageObj->setHtmlBody($message["html_body"]); } if (!empty($message["text_body"])) { $messageObj->setTextBody($message["text_body"]); } return $messageObj; } return false; } }
到此 我們就實現(xiàn)了redis隊列異步發(fā)送郵件
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/23137.html
摘要:消費者開發(fā)本例我們使用的多進程開發(fā)工具來完成這個需求,通常使用常駐進程來處理隊列的消費,所以我們使用的類型,模式。中進程負責執(zhí)行郵件發(fā)送任務(wù)。此時終端將打印成功收到測試郵件官網(wǎng) 注意:這個是 MixPHP V1 的范例 郵件發(fā)送是很常見的需求,由于發(fā)送郵件的操作一般是比較耗時的,所以我們一般采用異步處理來提升用戶體驗,而異步通常我們使用消息隊列來實現(xiàn)。 傳統(tǒng) MVC 框架由于缺少多進程...
摘要:消費者開發(fā)使用本例時,請確保你使用的編譯時開啟了本例我們采用的守護程序協(xié)程池來完成一個超高性能的郵件發(fā)送程序。 去年 Mix PHP V1 發(fā)布時,我寫了一個多進程的郵件發(fā)送實例: 使用 mixphp 打造多進程異步郵件發(fā)送,今年 Mix PHP V2 發(fā)布,全面的協(xié)程支持讓我們可以使用一個進程就可達到之前多個進程都無法達到的更高 IO 性能,所以今天重寫一個協(xié)程池版本的郵件發(fā)送實例。...
摘要:持久化到中反向代理的負載均衡基于的集群搭建如何實現(xiàn)從中訂閱消息轉(zhuǎn)發(fā)到客戶端的擴展是阻塞式,使用訂閱發(fā)布模式時,會導(dǎo)致整個進程進入阻塞。緩存是用于解決高并發(fā)場景下系統(tǒng)的性能及穩(wěn)定性問題的銀彈。 showImg(https://segmentfault.com/img/bVYE6k?w=900&h=385); Redis 是由意大利程序員 Salvatore Sanfilippo(昵稱:a...
摘要:前些時間我們發(fā)布了實例協(xié)程池異步郵件發(fā)送守護程序范例,這一次我們提供一個使用大廠通過協(xié)程化來并行執(zhí)行短信發(fā)送任務(wù),本文是一個代碼簡單性能極強的范例。 前些時間我們發(fā)布了 Mix PHP V2 實例:協(xié)程池異步郵件發(fā)送守護程序 范例,這一次我們提供一個使用大廠 SDK 通過 Swoole Hook 協(xié)程化來并行執(zhí)行短信發(fā)送任務(wù),本文是一個代碼簡單、IO 性能極強的范例。 請先升級到 m...
閱讀 3652·2021-09-02 15:11
閱讀 4563·2021-08-16 10:47
閱讀 1560·2019-08-29 18:35
閱讀 3030·2019-08-28 17:54
閱讀 2843·2019-08-26 11:37
閱讀 1496·2019-08-23 16:51
閱讀 1799·2019-08-23 14:36
閱讀 1801·2019-08-23 14:21