亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

redis的簡(jiǎn)單使用 異步發(fā)送郵件

娣辯孩 / 3725人閱讀

摘要:你是否也困在,知其然不知其所以然項(xiàng)目中到底怎么用一個(gè)簡(jiǎn)單的實(shí)例使用消息隊(duì)列實(shí)現(xiàn)下異步發(fā)送郵件準(zhǔn)備工作首先得配置服務(wù),之前寫(xiě)過(guò)相關(guān)的文章,可以參考下這里的操作庫(kù)使用安裝的依賴庫(kù)的相關(guān)配置到此中就可以使用進(jìn)行操作了同步與異步那么如何實(shí)現(xiàn)

你是否也困在redis,知其然不知其所以然~~ 項(xiàng)目中,到底怎么用?? 一個(gè)簡(jiǎn)單的實(shí)例,使用消息隊(duì)列實(shí)現(xiàn)下yii異步發(fā)送郵件

redis~~準(zhǔn)備工作:

首先得配置redis服務(wù),之前寫(xiě)過(guò)相關(guān)的文章,可以參考下這里 https://segmentfault.com/a/11...

yii的redis操作庫(kù):https://github.com/yiisoft/yi...

使用composer安裝redis的依賴庫(kù)

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進(jìn)行操作了

redis~~同步與異步

那么如何實(shí)現(xiàn)異步消息隊(duì)列發(fā)送郵件呢??

傳統(tǒng)的操作方法是這樣的:

用戶輸入郵件信息

服務(wù)器獲取用戶輸入的數(shù)據(jù),提交到第三方的郵件服務(wù)器

第三方郵件服務(wù)器發(fā)送郵件,返回處理結(jié)果

異步的處理郵件發(fā)送:

用戶輸入郵件相關(guān)信息

將注冊(cè)信息存儲(chǔ)在內(nèi)存隊(duì)列,通知用戶發(fā)送成功

服務(wù)器端監(jiān)聽(tīng)內(nèi)存隊(duì)列,將內(nèi)存隊(duì)列中的郵件數(shù)據(jù)依次發(fā)送 用戶感知不到

兩者的區(qū)別在哪?

異步相對(duì)于同步來(lái)說(shuō),頁(yè)面非阻塞,減少了用戶等待的時(shí)間體驗(yàn)相對(duì)來(lái)說(shuō)比較好

redis~~郵件發(fā)送

原理:
用戶輸入郵件信息,服務(wù)器接收到輸入的郵件信息,調(diào)用mail的過(guò)程,實(shí)則是對(duì)mail類屬性賦值的過(guò)程,這個(gè)時(shí)候,我們可以抓取用戶的信息,存儲(chǔ)到隊(duì)列,然后在隊(duì)列中,依次讀取郵件信息,進(jìn)行發(fā)送

 //實(shí)例化mail組件

$mailer = Yii::$app->mailer->compose();
$mailer->setFrom("發(fā)件人地址");
$mailer->setTo("收件人地址");
$mailer->setSubject("發(fā)送標(biāo)題");
//if ($mailer->send() && $this->reg($data, "regbymail")) {
//注意這里 本身是直接調(diào)用 send方法 進(jìn)行發(fā)送 現(xiàn)在重寫(xiě)父類方法 使用redis進(jìn)行處理 
if ($mailer->queue()) {
    return true;
}

這個(gè)時(shí)候 會(huì)去實(shí)例化mail類 進(jìn)行郵件發(fā)送,這個(gè)時(shí)候 我們可以抓取郵件信息 存儲(chǔ)到隊(duì)列中

    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郵件存儲(chǔ)的數(shù)據(jù)庫(kù) 是否存在
            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)容   存放到隊(duì)列中
            
            return $redis->rpush($mailer->key, json_encode($message));
        }
    }

 接下來(lái)就是讀取redis隊(duì)列,進(jìn)行發(fā)送的過(guò)程 
redis;
        if (empty($redis)) {
            throw new yiiaseInvalidConfigException("redis not found in config.");
        }
        //如果隊(duì)列中 存在數(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;
    }
}   

到此 我們就實(shí)現(xiàn)了redis隊(duì)列異步發(fā)送郵件

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/23137.html

相關(guān)文章

  • 使用 mixphp 打造多進(jìn)程異步郵件發(fā)送

    摘要:消費(fèi)者開(kāi)發(fā)本例我們使用的多進(jìn)程開(kāi)發(fā)工具來(lái)完成這個(gè)需求,通常使用常駐進(jìn)程來(lái)處理隊(duì)列的消費(fèi),所以我們使用的類型,模式。中進(jìn)程負(fù)責(zé)執(zhí)行郵件發(fā)送任務(wù)。此時(shí)終端將打印成功收到測(cè)試郵件官網(wǎng) 注意:這個(gè)是 MixPHP V1 的范例 郵件發(fā)送是很常見(jiàn)的需求,由于發(fā)送郵件的操作一般是比較耗時(shí)的,所以我們一般采用異步處理來(lái)提升用戶體驗(yàn),而異步通常我們使用消息隊(duì)列來(lái)實(shí)現(xiàn)。 傳統(tǒng) MVC 框架由于缺少多進(jìn)程...

    EdwardUp 評(píng)論0 收藏0
  • Mix PHP V2 實(shí)例:協(xié)程池異步郵件發(fā)送守護(hù)程序

    摘要:消費(fèi)者開(kāi)發(fā)使用本例時(shí),請(qǐng)確保你使用的編譯時(shí)開(kāi)啟了本例我們采用的守護(hù)程序協(xié)程池來(lái)完成一個(gè)超高性能的郵件發(fā)送程序。 去年 Mix PHP V1 發(fā)布時(shí),我寫(xiě)了一個(gè)多進(jìn)程的郵件發(fā)送實(shí)例: 使用 mixphp 打造多進(jìn)程異步郵件發(fā)送,今年 Mix PHP V2 發(fā)布,全面的協(xié)程支持讓我們可以使用一個(gè)進(jìn)程就可達(dá)到之前多個(gè)進(jìn)程都無(wú)法達(dá)到的更高 IO 性能,所以今天重寫(xiě)一個(gè)協(xié)程池版本的郵件發(fā)送實(shí)例。...

    lauren_liuling 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.37 - 分布式緩存利器:Redis

    摘要:持久化到中反向代理的負(fù)載均衡基于的集群搭建如何實(shí)現(xiàn)從中訂閱消息轉(zhuǎn)發(fā)到客戶端的擴(kuò)展是阻塞式,使用訂閱發(fā)布模式時(shí),會(huì)導(dǎo)致整個(gè)進(jìn)程進(jìn)入阻塞。緩存是用于解決高并發(fā)場(chǎng)景下系統(tǒng)的性能及穩(wěn)定性問(wèn)題的銀彈。 showImg(https://segmentfault.com/img/bVYE6k?w=900&h=385); Redis 是由意大利程序員 Salvatore Sanfilippo(昵稱:a...

    binaryTree 評(píng)論0 收藏0
  • Mix PHP V2 實(shí)例:AliCloud 短信協(xié)程池異步發(fā)送守護(hù)程序

    摘要:前些時(shí)間我們發(fā)布了實(shí)例協(xié)程池異步郵件發(fā)送守護(hù)程序范例,這一次我們提供一個(gè)使用大廠通過(guò)協(xié)程化來(lái)并行執(zhí)行短信發(fā)送任務(wù),本文是一個(gè)代碼簡(jiǎn)單性能極強(qiáng)的范例。 前些時(shí)間我們發(fā)布了 Mix PHP V2 實(shí)例:協(xié)程池異步郵件發(fā)送守護(hù)程序 范例,這一次我們提供一個(gè)使用大廠 SDK 通過(guò) Swoole Hook 協(xié)程化來(lái)并行執(zhí)行短信發(fā)送任務(wù),本文是一個(gè)代碼簡(jiǎn)單、IO 性能極強(qiáng)的范例。 請(qǐng)先升級(jí)到 m...

    qc1iu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<