編寫基於 Redis 郵件異步發送工具

1. 異步發送郵件工具原理;

現有郵件發送系統的實現:

  • 用戶點擊註冊
  • 連接郵箱服務器
  • 將註冊信息發送給郵箱服務器
  • 郵箱服務器返回結果到本地 WEB 服務器

不可控因素

  • 網絡問題:如果網絡比較慢,連接郵箱服務器的時候,響應比較慢,用戶體驗差

解決方案

  • 用戶註冊後,將註冊信息儲存在本地服務器內存隊列,通知用戶發送成功
  • 服務端離線跑一個程序,監聽內存隊列,將隊列中的郵件數據依次發送
  • 用戶感知不到,體驗好

相關工具和內容

  • 安裝 Redis 服務
  • 編寫插件類(Yii2 框架)
  • 重寫 SwiftMailer 類的方法:本來是直接發送,現在要往隊列裏存
  • 提交至 Github,提交 Composer,使用 Composer 下載插件

2. 安裝 Redis 服務;

  • 下載安裝包
cd /usr/local/src
# 訪問 Redis 官網來到 Download 頁面:https://redis.io/download
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
  • 解壓
tar zxvf redis-5.0.5.tar.gz
  • 安裝
# 進入軟件目錄
cd redis-5.0.5
# 之前安裝軟件的方法:yum、rpm 或者通過二進制包進行編譯
# 但是 redis-5.0.5 沒有 config 命令,不能配置
# 但是有 Makefile,也就是說,配置都已經做好了,所以只需要調用 Makefile 就行
make PREFIX=/usr/local/redis
  • 配置
# 把 redis.conf 複製到安裝路徑下
mkdir -p /usr/local/etc
cp redis.conf /usr/local/redis/src
  • 製作啓動腳本
vim utils/redis_init_script

# 修改如下代碼
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli
PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/${REDISPORT}.conf"

# 修改爲
EXEC=/usr/local/redis/bin/redis-server
CLIEXEC=/usr/local/redis/bin/redis-cli
PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/${REDISPORT}.conf"  # 軟鏈到 /usr/local/redis/etc/redis.conf
# 退出保存

# 做 redis.conf 的軟鏈
ln -s /user/local/redis/etc/redis.conf /etc/redis/6379.conf

# 修改 redis 爲後臺運行
vim /etc/redis/6379.conf
/daemonize
# 將下面
daemonize no
# 改成
daemonize yes

# 啓動腳本複製到啓動目錄 /etc/init.d/
cp redis_init_script /etc/init.d/redis

# 啓動 redis
/etc/init.d/redis start

# 查看端口
netstat -tunpl | grep 6379

# 設置 Redis 開啓啓動
vim /etc/init.d/redis
# 在第二行加上
#chkconfig:2345 80 90
# 保存退出
chkconfig --add redis
chkconfig redis on

# 重啓 Redis
service redis stop
service redis start

# 登錄 Redis
/usr/local/redis/bin/redis-cli

3. 安裝 PHP 的 Redis 擴展;

cd /usr/local/src
git clone https://github.com/phpredis/phpredis.git
  • 安裝
cd phpredis/

# 通過 phpize 建立 PHP 的外掛模塊,生成 configure
phpize

# 配置指定安裝目錄 
./configure --with-php-config=/usr/local/php/bin/php-config

# 配置安裝 && 編譯安裝
make && make install

# 配置 php.ini
echo "[redis]" >> /usr/local/php/etc/php.ini
echo "extension = redis.so" >> /usr/local/php/etc/php.ini

# 重啓 nginx 和 php
systemctl restart nginx
/etc/init.d/php-fpm restart

4. 安裝 Yii2 的 Redis 插件;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章