当前位置: 首页 > 后端技术 > PHP

redis的简单使用异步发送邮件

时间:2023-03-29 17:37:25 PHP

你是不是也卡在redis中,知其然不知其所以然~~在项目中,如何使用呢??一个简单的例子,使用消息队列实现yii异步发送邮件到redis~~准备工作:首先配置redis服务。之前写过相关文章,可以参考https://segmentfault.com/a/11..yii的redis操作库:https://github.com/yiisoft/yi...使用composer安装redis的依赖库phpcomposer.pharrequire--prefer-distyiisoft/yii2-redisweb.php相关配置:return[//....'components'=>['redis'=>['class'=>'yii\redis\Connection','hostname'=>'localhost','port'=>6379,'database'=>0,],]];至此,在yii中就可以使用redis来操作redis了~~同步和异步,那么如何实现异步消息队列来发送邮件呢??传统的操作方式是:用户输入邮件信息,服务器获取用户输入的数据,提交给第三方邮件服务器,第三方邮件服务器发送邮件,返回处理结果,并异步处理邮件:用户将邮件相关信息和注册信息放入内存队列中,通知用户发送成功。服务器监听内存队列,将内存队列中的邮件数据一一发送出去。用户察觉不到两者的区别?与同步相比,异步页面是非阻塞的,减少了用户的等待时间。体验相对较好。给邮件类的属性赋值的过程。这时候我们可以抓取用户的信息,存入队列,然后依次读取队列中的邮件信息,发送。//实例化邮件组件$mailer=Yii::$app->mailer->compose();$mailer->setFrom('sender'saddress');$mailer->setTo('recipient'saddress地址');$mailer->setSubject('sendsubject');//if($mailer->send()&&$this->reg($data,'regbymail')){//注意这个本身就是直接调用send发送方法。现在重写父类方法,使用redis处理if($mailer->queue()){returntrue;}这时候我们实例化mail类来发送邮件。这时候我们可以抓取队列中的邮件信息Storeredis;if(empty($redis)){thrownew\yii\base\InvalidConfigException('redisnotfoundinconfig.');}//0-15选择0选择1//db=>1$mailer=Yii::$app->mailer;//邮件数据库是否存在if(empty($mailer)||!$redis->select($mailer->db)){thrownew\yii\base\InvalidConfigException('dbnotdefined.');}//抓取邮件信息$message=[];$混乱年龄['来自']=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();如果(!is_array($parts)||!sizeof($parts)){$parts=[$this->getSwiftMessage()];}foreach($partsas$part){if(!$partinstanceof\Swift_Mime_Attachment){//获取内容类型switch($part->getContentType()){case'text/html':$message['html_body']=$part->getBody();休息;case'text/plain':$message['text_body']=$part->getBody();休息;}if(!$message['charset']){$message['charset']=$part->getCharset();}}}//将抓取的内容序列化存入队列return$redis->rpush($mailer->key,json_encode($message));}}接下来是读取redis队列,发送过程public$key='邮件';公共$db='1';/*发送邮件*/publicfunctionprocess(){$redis=Yii::$app->redis;if(empty($redis)){thrownew\yii\base\InvalidConfigException('redisnotfoundinconfig.');}//如果队列中有数据if($redis->select($this->db)&&$messages=$redis->lrange($this->key,0,-1)){$messageObj=newMessage;//遍历邮件列表foreach($messagesas$message){$message=json_decode($message,true);if(empty($message)||!$this->setMessage($messageObj,$message)){thrownew\ServerErrorHttpException('消息错误');}if($messageObj->send()){$redis->lrem($this->key,-1,json_encode($message));}}}返回真;}//设置消息头publicfunctionsetMessage($messageObj,$message){if(empty($messageObj)){returnfalse;}if(!empty($message['from'])&&!empty($message['to'])){$messageObj->setFrom($message['from'])->setTo($message['到']);如果(!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']);}返回$messageObj;}返回假;}}至此我们实现了redis队列异步发送邮件