首页 > 数据库 >thinkphp: 用redis存储短信验证码(thinkphp v6.0.12LTS)

thinkphp: 用redis存储短信验证码(thinkphp v6.0.12LTS)

时间:2023-04-16 22:25:13浏览次数:51  
标签:v6.0 code mobile cache redis 验证码 缓存 thinkphp

一,配置redis

1,编辑.env

[REDIS0]
TYPE = redis
HOST = 127.0.0.1
PORT = 6379
PASSWORD =

2,config/cache.php

<?php

// +----------------------------------------------------------------------
// | 缓存设置
// +----------------------------------------------------------------------

return [
    // 默认缓存驱动
    'default' => env('cache.driver', 'file'),

    // 缓存连接方式配置
    'stores'  => [
        'file' => [
            // 驱动方式
            'type'       => 'File',
            // 缓存保存目录
            'path'       => '',
            // 缓存前缀
            'prefix'     => '',
            // 缓存有效期 0表示永久缓存
            'expire'     => 0,
            // 缓存标签前缀
            'tag_prefix' => 'tag:',
            // 序列化机制 例如 ['serialize', 'unserialize']
            'serialize'  => [],
        ],
        // 更多的缓存连接
        'redis0'    =>    [
            'type'     => env('redis0.type', 'redis'),
            'host'     => env('redis0.host', '127.0.0.1'),
            'port'     => env('redis0.port', '6379'),
            'password' => env('redis0.password', ''),
            'select'   => '0',
            // 全局缓存有效期(0为永久有效)
            'expire'   => 0,
            // 缓存前缀
            'prefix'   => '',
            'timeout'  => 0,
        ],
    ],
];

说明:短信验证码的发送频率控制,参见这一篇:

https://www.cnblogs.com/architectforest/p/17323844.html

二,php代码:

1,app/lib/AuthCodeUtil.php

<?php
namespace app\lib\util;


//短信验证码存储到redis
class AuthCodeUtil {
    //redis连接
    private $cache;
    //验证码的保存秒数,600秒,即:10分钟
    private $ttl = 600;

    //构造
    public function __construct($cache){
        $this->cache = $cache;
    }

    //生成code保存到redis,并返回code
    public function setCode($mobile) {
        $key = "Auth:".$mobile;
        $code = $this->newAuthCode();
        $this->cache->set($key,$code,$this->ttl);
        return $code;
    }

    //校对验证码
    public function verifyCode($mobile,$code) {
        $key = "Auth:".$mobile;
        $cacheCode = $this->cache->get($key);
        //var_dump($cacheCode);
        if ($cacheCode == $code) {
            return true;
        } else {
            return false;
        }
    }

    //生成一个验证码
    public function newAuthCode(){
        $code = rand(100000,999999);
        return $code;
    }
}

2,controller中调用:

class Sms extends BaseController
{
    private $cache;//cache的连接

    public function __construct(App $app = null){
         //继承父类的构造方法
         parent::__construct($app);
        $this->cache = Cache::store('redis0');
    }

    //发送验证码
    public function send() {
          $mobile = $this->request->param('mobile','','string');
          //检查发送频率,返回是否可发送
          $rate = new SmsRateUtil($this->redis);
          $ret = $rate->setRate($mobile);
           $res = "";
          if ($ret == '1') {    //可发送
             //生成code并保存到redis
             $auth = new AuthCodeUtil($this->cache);
             $code = $auth->setCode($mobile);
             //发送短信代码,需调用短信服务商的sdk

             //返回
             $data = ['msg'=>'短信已发送'];
             return Result::Success($data);
          } else if ($ret == '0') {
             $res = "请超过60秒之后再发短信";
          } else if ($ret == '2') {
             $res = "当前手机号本日内发送数量已超限制";
          } else {
             $res = "发生错误";
          }
          return Result::ErrorCode(10024,$res);
    }


    //检查验证码是否正确
    public function verify(){
        $mobile = $this->request->param('mobile','','string');
        $code = $this->request->param('code','','string');
        //验证
        $auth = new AuthCodeUtil($this->cache);
        $ret = $auth->verifyCode($mobile,$code);
        if ($ret == true){
           echo "验证码正确";
        }  else {
           echo "验证码错误";
        }
    }

三,测试效果

说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest

         对应的源码可以访问这里获取: https://github.com/liuhongdi/
         或: https://gitee.com/liuhongdi

说明:作者:刘宏缔 邮箱: [email protected]

四,查看thinkphp的版本:

liuhongdi@lhdpc:/data/php/imgtouch$ php think version
v6.0.12LTS 

 

标签:v6.0,code,mobile,cache,redis,验证码,缓存,thinkphp
From: https://www.cnblogs.com/architectforest/p/17324249.html

相关文章

  • Redis疑问
    为什么redis默认16个库,建议仅使用第一个库?如果Redis各个库都有在使用,会有以下影响或者问题:数据混乱:如果不同的应用程序使用同一个Redis的不同库,那么就可能出现键名冲突的情况,导致数据被覆盖或者错误地读取。同一个Redis不同库会导致数据被覆盖数据混乱的原因是:键名冲突:......
  • day02-Redis命令
    Redis命令1.Redis数据结构介绍Redis是一个key-value的数据库,key一般是String类型,value的类型多种多样,value常见的八种类型:Redis支持五种基本的数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sortedset,有序集合)。各个数据类型应用场景:类型简介特性场景S......
  • thinkphp:redis+lua实现短信发送频率限制(thinkphp v6.0.12LTS)
    一,配置:.env中[REDIS0]TYPE=redisHOST=127.0.0.1PORT=6379PASSWORD=二,php代码:1,lib\util\SmsRateUtil.php<?phpnamespaceapp\lib\util;//短信验证码发送频率classSmsRateUtil{//redis连接private$redis;//60秒内不允许重复发送pri......
  • Redis
    一、redis数据类型1.字符串类型2.哈希类型(适合存储对象)3.列表4.set(无序不重复元素)5.sortedset(有序不重复元素)二.redis常用命令......
  • redis 一般有用 看1
    redis和memcached什么区别?为什么高并发下有时单线程的redis比多线程的memcached效率要高?区别:1.mc可缓存图片和视频。rd支持除k/v更多的数据结构;2.rd可以使用虚拟内存,rd可持久化和aof灾难恢复,rd通过主从支持数据备份;3.rd可以做消息队列。原因:mc多线程模......
  • Redis分布式锁这样用,有坑?
    背景在微服务项目中,大家都会去使用到分布式锁,一般也是使用Redis去实现,使用RedisTemplate、Redisson、RedisLockRegistry都行,公司的项目中,使用的是Redisson,一般你会怎么用?看看下面的代码,是不是就是你的写法StringlockKey="forlan_lock_"+serviceId;RLocklock=redis......
  • Redis:基本配置与使用?
    一、基于C语言,配置好c环境yuminstall-ygcctcl二、配置文件://监听的请求ip,默认为本地访问,修改为0000为任意访问bind0.0.0.0//设置程序为守护进程,即后台运行daemonizeyes//设置连接密码requirepasspassword//配置日志文件logfile"redis.log"//配置工作目......
  • Redis:数据类型和常用命令有哪些?
    通用命令查询所有的key:keys* 查询a开头的,长度为2的key:keysa?删除指定的key:delkeyName判断指定key是否存在:existskeyName给指定key设置有效期:expirekeyNameseconds查看key的剩余有效时间:ttlkeyName(-1为永久有效,-2为已被删除) ......
  • [转]windows下安装、启动redis及设置密码
    原文地址:https://blog.csdn.net/ptsx0607/article/details/88638180主要问题:因为给redis设置了密码,所以运行需要加载配置文件,修改密码步骤:redis.windows.conf配置文件搜索requirepass,取消注释#,空格后填写自己的密码.使用绿色版的,默认建立redis-server.exe的快捷方式,......
  • Redis的哈希表是如何扩容的?
    文章目录一般面试回答哈希表结构字典数据结构解决哈希冲突扩容/缩容对字典的哈希表rehash步骤渐进式rehash渐进式rehash步骤相关问题一般面试回答redis解决冲突的方法是使用链地址法,另外当容量不足的时候,则使用Rehash进行扩容。Rehash:给哈希表2分配更大的空间,例如是当前哈希......